{
 "cells": [
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T02:32:46.034696Z",
     "start_time": "2025-02-04T02:32:42.551669Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n",
    "\n",
    "seed = 42\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.1\n",
      "torch 2.5.1+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T02:32:56.799522Z",
     "start_time": "2025-02-04T02:32:51.700615Z"
    }
   },
   "source": [
    "from tensorflow import keras  #这里的波浪线不用管\n",
    "\n",
    "#用karas有的数据集imdb，电影分类,分电影是积极的，还是消极的\n",
    "imdb = keras.datasets.imdb\n",
    "#载入数据使用下面两个参数\n",
    "vocab_size = 10000  # 词典大小，仅保留训练数据中前10000个最经常出现的单词，低频单词被舍弃\n",
    "index_from = 3  # 词索引0,1,2,3空出来做别的事\n",
    "# 前10000个词出现词频最高的会保留下来进行处理，后面的作为特殊字符处理，\n",
    "# 小于3的id都是特殊字符，下面代码有写\n",
    "# 需要注意的一点是取出来的词表还是从1开始的，需要做处理\n",
    "(train_data, train_labels), (test_data, test_labels) = imdb.load_data(\n",
    "    num_words=vocab_size, index_from=index_from)"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "source": [
    "# 都是ndarry\n",
    "print(type(train_data))\n",
    "print(type(train_labels))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T02:33:00.453013Z",
     "start_time": "2025-02-04T02:33:00.449247Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'numpy.ndarray'>\n",
      "<class 'numpy.ndarray'>\n"
     ]
    }
   ],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "source": [
    "# 每个样本是一段话，每个单词用一个数字（索引）表示\n",
    "print(len(train_data))\n",
    "print(type(train_data[0]))\n",
    "print(train_data[0])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T02:33:59.351472Z",
     "start_time": "2025-02-04T02:33:59.347521Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25000\n",
      "<class 'list'>\n",
      "[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "cell_type": "code",
   "source": [
    "print(len(train_labels))\n",
    "train_labels[0:10]  #二分类"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T02:34:55.500724Z",
     "start_time": "2025-02-04T02:34:55.496587Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25000\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([1, 0, 0, 1, 0, 0, 1, 0, 1, 0], dtype=int64)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "cell_type": "code",
   "source": [
    "print(\"train\", len(train_data), train_labels.shape)  #25000个样本，每个样本是一段话，每个单词用一个数字表示\n",
    "print(\"test\", len(test_data), test_labels.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T02:35:13.855061Z",
     "start_time": "2025-02-04T02:35:13.850765Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train 25000 (25000,)\n",
      "test 25000 (25000,)\n"
     ]
    }
   ],
   "execution_count": 12
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T02:35:56.089739Z",
     "start_time": "2025-02-04T02:35:56.046193Z"
    }
   },
   "source": [
    "#载入词表，看下词表长度，词表就像英语字典\n",
    "word_index = imdb.get_word_index()\n",
    "print(len(word_index))\n",
    "print(type(word_index))\n",
    "#词表虽然有8万多，但是我们只载入了最高频的1万词！！！！"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "88584\n",
      "<class 'dict'>\n"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构造 word2idx 和 idx2word"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T02:37:56.182061Z",
     "start_time": "2025-02-04T02:37:56.146621Z"
    }
   },
   "source": [
    "word2idx = {word: idx + 3 for word, idx in word_index.items()}  # 0,1,2,3空出来做别的事,这里的idx是从1开始的,所以加3\n",
    "word2idx.update({\n",
    "    \"[PAD]\": 0,  # 填充 token\n",
    "    \"[BOS]\": 1,  # begin of sentence\n",
    "    \"[UNK]\": 2,  # 未知 token\n",
    "    \"[EOS]\": 3,  # end of sentence\n",
    "})\n",
    "\n",
    "idx2word = {idx: word for word, idx in word2idx.items()}  # 反向词典,id变为单词"
   ],
   "outputs": [],
   "execution_count": 17
  },
  {
   "cell_type": "code",
   "source": [
    "print(word2idx[\"hello\"])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T02:37:58.516557Z",
     "start_time": "2025-02-04T02:37:58.513096Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4825\n"
     ]
    }
   ],
   "execution_count": 18
  },
  {
   "cell_type": "code",
   "source": [
    "print(idx2word[0])\n",
    "print(idx2word[4825])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T02:38:26.962385Z",
     "start_time": "2025-02-04T02:38:26.958672Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[PAD]\n",
      "hello\n"
     ]
    }
   ],
   "execution_count": 20
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T02:39:47.985020Z",
     "start_time": "2025-02-04T02:39:47.231719Z"
    }
   },
   "source": [
    "# 选择 max_length\n",
    "length_collect = {}\n",
    "#统计样本中每个长度出现的次数\n",
    "for text in train_data:\n",
    "    length = len(text)  #句子长度\n",
    "    length_collect[length] = length_collect.get(length, 0) + 1  #统计长度的频率\n",
    "\n",
    "MAX_LENGTH = 500\n",
    "plt.bar(length_collect.keys(), length_collect.values())  #长度分布图\n",
    "plt.axvline(MAX_LENGTH, label=\"max length\", c=\"gray\", ls=\":\")  # 画一条线，可以看到大部分都在500以内，考虑选定句子最大长度不超过500，超出部分截断\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 21
  },
  {
   "cell_type": "code",
   "source": [
    "#想对句子长度画个直方图，看看长度分布\n",
    "length_list = [len(text) for text in train_data]\n",
    "plt.hist(length_list, bins=50)\n",
    "plt.xlabel(\"length\")\n",
    "plt.ylabel(\"frequency\")\n",
    "plt.axvline(500, label=\"max length\", c=\"gray\", ls=\":\")  # 画一条线，可以看到大部分都在500以内，考虑选定句子最大长度不超过500，超出部分截断\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T02:41:14.698082Z",
     "start_time": "2025-02-04T02:41:14.561262Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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wJr0tNts9erVdjNr2bKle4xGobp429KlS+25Puobx3nDKA1yEhMTZePGje4xwedwjnHOcbalHvQcwRuyJu3j135n3YL7+wF4n34o1i04k7HewPW11GMKw3HshUj9IU3PGfya8z20xUR99NFHFrzpOCJtFNCeD20hCu7KUho8/Pzzz1avLVu2pKtOR44ckbp169q5gzc9X6dOnc5Zd6eeFysjz302UTPKVCNZXaBPB2o5qxfrG06b0oJp8KP7nGOCgyFnv7PvXMdokKORtQ72Sk37hrVJElmf/iP7+9//7pYBICvT8Tw6vujhhx92XwtutXFo44I2GGjgpN1v2jCgPSRpUadOHes203G5BQsWvKB66mBvHc/7448/WnCltNXpzz//PCPwiZaUKFHTQqTdYzfffLOUKVMmKppZtcvO2XS0PbImberWvmndmHYPIKvTcUWrVq2ycbDaYvPkk0+mGIzsdKlpL4iOq9UxRjobTB9TtyKdTefOnW0ck84s00HVOhZXxw49+uijsnv37jSdQ3t0NAjT2W46YFwDIy1rI0Rwy5p2jenYIG28SB0sZbaouEPogC8dB6QDwBx6A9NfnrYaBdNZZrrPOSb1rDPn+fmO0ag3VOuQ0tlouj94AwAg0rTFWycXdejQwQYr64Dr4NYiHcyss63HjRsnZcuWtde0/Pvvv1vwlBb58uWTb775xoao6PfSliVtadIxROm5H7733nvWI9OsWTObWq8tVTouSAeOO3R8r06o0rpee+21EkkxgSgYWKEDoN98801riXG6NbRlRgddT5kyxabbO4O0NOrUyFcHxelAMR3ZrjPUtGlP6bQ+fTNo/6kGNjrAWqdXOgO9lPaBHjhwQGbPnp2m+mn3muZB0DpFc3CUlmn1O0a3ET/Rpljnd6/Nxxfazw8gOulNWlswdPJM8I0W0Wf37t0W+GgDSIsWLTLlPZCe+3fEB1XoICmdPdatW7cUYzz0B9CINC4uzpJC6Q+is4QaNWpkwZDS/AyahVin440ZM8aa3HT6ouYu0mBI9erVy0bZDx482PpUFyxYYNMTZ80iJ49fAiLNxaH0vUJABACZY8GCBTZAWz+MasOF3oe1i0xbjKJRxAMijRR16mCohFE6NV7HfWgLkc780tlh2vTn0JubJmzSRFYaKOXPn98Cq5EjR7rHaMSowY/mNNJkWprQSnMhMOXeH/T9o33uThkAkDmSk5MtaeS2bdusq0wHg2vSyGhNfxIVXWbRji4zAIhOdJkhKUxdZnxkBgBkeXy2969AmH73BEQAgCzL6X4JXq8M/nLi/9IJXOwY0YiPIQIyug9bl29xBthHa981gAujN0FN4Oss66BTxoPz3MDbTp8+bYvs6u/9YpPvEhDB802pmmLBKQPwHifvXEavdYXopBNmNGfSxQbCBETwNP3EoOv8OGUA3qM3Ql38U/PRaasw/CVXrlxhmUXMHQK++OQAwB/dZ+Qaw4ViUDUAAPA9Wojg+QF3P/30k5V1PR6SMwIAQuHuAE87efKkfPLJJ7ZpGQCAUGghgucHW5YvX94tAwAQCgERPE3zDnXv3j3S1QAARDm6zAAAgO8REAEAAN+jywyepkna3nnnHSv36NGDpTsAACEREMHTdLmOffv2uWUAAEIhIIKn6XId9913n1sGACAU7hDwNE3EWKlSpUhXAwAQ5RhUDQAAfI8WInh+6Y6tW7dauXLlyizdAQAIibsDPE2X65gyZYptLN0BADgbWojgabpcR5kyZdwyAAChEBDB0zTvUM+ePSNdDQBAlKPLDAAA+B4BEQAA8D26zOD5pTvef/99K3fp0oWlOwAAIREQwdN0uY5du3a5ZQAAQiEggqfpch0dOnRwywAAhMIdAp6miRirVq0a6WoAAKIcg6oBAIDv0UIEzy/dsXPnTiuXK1eOpTsAACFxd4Cn6XIdkyZNso2lOwAAZ0MLETxNl+soXry4WwYAIBQCInia5h16+OGHI10NAECUo8sMAAD4HgERAADwPbrM4PmlOz766CMrd+zYkaU7AAAhERDB03S5jm3btrllAABCISCCp+lyHe3atXPLAACEwh0CnqaJGGvVqhXpagAAolzEB1X/97//lfvuu0+KFi0qefPmlZo1a8qqVavc/drNMXz4cCldurTtb9mypWzZsiXFOQ4cOCCdO3eWggULSuHChaVHjx5y5MiRFMesW7dOmjZtKnny5JGyZcvKmDFjMu1nBAAA0S2iAdGff/4pjRs3toGuX331lWzatElefPFFufTSS91jNHD517/+JePHj5fly5dL/vz5JTY2VpKSktxjNBjauHGjzJ07V2bOnCnffPONPPTQQ+7+xMREadWqlZQvX15Wr14tzz//vDz99NPy1ltvZfrPjMxfukODbt20DABAKDGBCI40HTp0qCxZskS+/fbbkPu1amXKlJEBAwbIwIED7bVDhw5JyZIlZeLEiTZr6KeffpLq1avLypUrpV69enbM7Nmz5ZZbbpHdu3fb17/xxhvy+OOPy969eyVXrlzu954xY4Zs3rz5jO97/Phx24IDKm1V0u+trVDRqsLQWec9ZsfoNuInJ06ckFGjRll52LBh7u8fAOB9iYmJUqhQoTTdvyPaQvT5559bEHP33XdLiRIl5Nprr5V///vf7v7t27dbEKPdZA79wRo0aCBLly615/qo3WROMKT0eB07oi1KzjHNmjVLcTPUVqb4+HhrpUpNb6D6fZxNgyFkTbpch/N7ZOkOAEBUBkQ6HVpbb6688kqZM2eO9O7dWx599FFbiFNpMKS0RSiYPnf26aMGU8F0NlGRIkVSHBPqHMHfI5i2JGg06Wy7du0K68+NzKPdsf369bONHEQAgKicZaZjOrRl55///Kc91xaiDRs22Hihbt26RaxeuXPntg0AAPhDRFuIdOaYjv8JVq1aNdm5c6eVS5UqZY/79u1LcYw+d/bpY0JCQor9J0+etJlnwceEOkfw9wAAAP4V0YBIZ5jpOJ5gP//8s80GUxUrVrSAZf78+SkGSOnYoEaNGtlzfTx48KDNHnMsWLDAWp90rJFzjM4802UcHDojrUqVKilmtMF7NDjWpTt00zIAAFEXEPXv31+WLVtmXWZbt26VDz/80KbC9+nTx/brIFgd+/Hss8/aAOz169dL165dbeZY27Zt3Ral1q1bS8+ePWXFihU2a61v3742A02PU506dbIB1ZqfSKfnf/zxxzJ27FiJi4uL5I+PTKCBsQbdujHtHgAQlWOI6tevL9OnT7dBzCNHjrQWoVdeecXyCjkGDx4sf/31l+UV0pagJk2a2LR6TbDomDx5sgVBLVq0sNll7du3t9xFDp1h9PXXX1ugVbduXSlWrJglewzOVQRvyp49u9x6661uGQCAqMtD5MU8BpFEHiIAALJgHiIAAIBowOKu8DRtAN2/f7+VixcvTnJGAEBItBDB03RmoSb/1C14liEAAMFoIYLn5cuXL9JVAABEOQIieJqmWxg0aFCkqwEAiHJ0mQEAAN8jIAIAAL5Hlxk8TZfr0Czn6vbbb5ccOXjLAwDORAsRPE2X69AlX3Rj6Q4AwNnwcRmepst1xMbGumUAAEIhIIKnaRDUsGHDSFcDABDl6DIDAAC+RwsRPL90hy7qp3SBP5buAACEQgsRPE2X6xg7dqxtLN0BADgbWojgeTlz5ox0FQAAUY6ACJ5fuuMf//hHpKsBAIhydJkBAADfIyACAAC+R5cZPL90x5dffmnlW265haU7AAAh0UIET9PlOn788UfbWLoDAHA2fFyG5zNVN2/e3C0DABAKARE8TYOgZs2aRboaAIAoR5cZAADwPVqI4PmlO44ePWrlfPnysXQHACAkWojgabpcxwsvvGAbS3cAAM6GgAgAAPgeXWbw/NIdTz31VKSrAQCIcrQQAQAA3yMgAgAAvkeXGTy/dMe8efOs3LJlS5buAACERAsRPE2X61i+fLltLN0BADgbPi7D85mqmzRp4pYBAAiFgAiepkFQixYtIl0NAECUo8sMAAD4Hi1E8PzSHU6G6pw5c7J0BwAgJFqI4GkaDI0aNco2lu4AAJwNAREAAPA9uszgadpNNmzYMLcMAEDUtRA9/fTTNqYjeKtataq7PykpSfr06SNFixaVAgUKSPv27WXfvn0pzrFz505p06aN5MuXT0qUKCGDBg2yZHzBFi1aJHXq1JHcuXNL5cqVZeLEiZn2MyKy9D2l65npxvghAEDUdpldffXVsmfPHnf77rvv3H39+/eXL774QqZNmyaLFy+W3377Te688053/6lTpywYOnHihHz//fcyadIkC3aGDx/uHrN9+3Y7pnnz5rJmzRrp16+fPPjggzJnzpxM/1kBAEB0iniXmS6lUKpUqTNeP3TokLzzzjvy4Ycfyk033WSvTZgwQapVqybLli2Thg0bytdffy2bNm2ypRlKliwptWvXlmeeeUaGDBlirU/aKjB+/HipWLGivPjii3YO/XoNul5++WWJjY3N9J8XmUuDZm0hVDfeeCPJGQEA0dlCtGXLFilTpoxcccUV0rlzZ+sCU6tXr7ZZQbr+lEO708qVKydLly615/pYs2ZNC4YcGuQkJibKxo0b3WOCz+Ec45wjlOPHj9s5gjdk3YBIA2DdtAwAQNQFRA0aNLAurtmzZ8sbb7xh3VtNmzaVw4cPy969e62Fp3Dhwim+RoMf3af0MTgYcvY7+851jAY5x44dC1kvnaJdqFAhdytbtmxYf25knmzZstn7TDctAwAQdV1mN998s1uuVauW3bTKly8vU6dOlbx580as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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 22
  },
  {
   "cell_type": "markdown",
   "source": [],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "source": [
    "length_list[0:10]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T02:43:31.454013Z",
     "start_time": "2025-02-04T02:43:31.449022Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[218, 189, 141, 550, 147, 43, 123, 562, 233, 130]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 23
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tokenizer"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:05:21.076319Z",
     "start_time": "2025-02-04T03:05:21.046040Z"
    }
   },
   "source": [
    "class Tokenizer:\n",
    "    def __init__(self, word2idx, idx2word, max_length=500, pad_idx=0, bos_idx=1, eos_idx=3, unk_idx=2):\n",
    "        self.word2idx = word2idx  #词表,单词到id\n",
    "        self.idx2word = idx2word  #词表，id到单词\n",
    "        self.max_length = max_length\n",
    "        self.pad_idx = pad_idx  #填充\n",
    "        self.bos_idx = bos_idx  #开始\n",
    "        self.eos_idx = eos_idx  #结束\n",
    "        self.unk_idx = unk_idx  #未知，未出现在最高频词表中的词\n",
    "\n",
    "    def encode(self, text_list):\n",
    "        \"\"\"\n",
    "        将文本列表转化为索引列表\n",
    "        :param text_list:当前批次的文本列表\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        #  最大长度500，但是如果句子长度小于500，就取句子长度（句子长度是本批句子中最长的），把一个批次变为方阵，+2是为了留出开始和结束的位置\n",
    "        max_length = min(self.max_length, 2 + max([len(text) for text in text_list]))  \n",
    "        indices = []\n",
    "        for text in text_list:\n",
    "            index = [self.word2idx.get(word, self.unk_idx) for word in text]  #单词转化为id，未知的词用unk_idx代替\n",
    "            index = [self.bos_idx] + index + [self.eos_idx]  # 添加开始和结束\n",
    "            if len(index) < max_length:\n",
    "                index = index + [self.pad_idx] * (max_length - len(index))  #填充0\n",
    "            else:\n",
    "                index = index[:max_length]  #如果句子长度大于500，就截断\n",
    "            indices.append(index)\n",
    "        return torch.tensor(indices)  #二维列表转化为tensor\n",
    "\n",
    "    def decode(self, indices_list, remove_bos=True, remove_eos=True, remove_pad=True, split=False):\n",
    "        \"\"\"\n",
    "        将索引列表转化为文本列表\n",
    "        :param indices_list:某批次的索引列表\n",
    "        :param remove_bos:\n",
    "        :param remove_eos:\n",
    "        :param remove_pad:\n",
    "        :param split:\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        text_list = []\n",
    "        for indices in indices_list:\n",
    "            text = []\n",
    "            for index in indices:\n",
    "                word = self.idx2word.get(index, \"[UNK]\")\n",
    "                if remove_bos and word == \"[BOS]\":\n",
    "                    continue\n",
    "                if remove_eos and word == \"[EOS]\":\n",
    "                    break\n",
    "                if remove_pad and word == \"[PAD]\":\n",
    "                    break\n",
    "                text.append(word)\n",
    "            text_list.append(\" \".join(text) if not split else text) # split=True时，返回单词列表，否则返回字符串\n",
    "        return text_list\n",
    "\n",
    "\n",
    "tokenizer = Tokenizer(word2idx=word2idx, idx2word=idx2word)\n",
    "raw_text = [\"hello world\".split(), \"tokenize text datas with batch\".split(), \"this is a test\".split()]\n",
    "indices = tokenizer.encode(raw_text)  # encode支持批量处理\n",
    "\n",
    "print(\"raw text\")\n",
    "for raw in raw_text:\n",
    "    print(raw)\n",
    "\n",
    "print(\"indices\")\n",
    "for index in indices:\n",
    "    print(index)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "raw text\n",
      "['hello', 'world']\n",
      "['tokenize', 'text', 'datas', 'with', 'batch']\n",
      "['this', 'is', 'a', 'test']\n",
      "indices\n",
      "tensor([   1, 4825,  182,    3,    0,    0,    0])\n",
      "tensor([    1,     2,  3004,     2,    19, 19233,     3])\n",
      "tensor([   1,   14,    9,    6, 2181,    3,    0])\n"
     ]
    }
   ],
   "execution_count": 27
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:12:34.590074Z",
     "start_time": "2025-02-04T03:12:34.586702Z"
    }
   },
   "cell_type": "code",
   "source": [
    "decode_text = tokenizer.decode(indices.tolist(), remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "print(\"decode text\")\n",
    "for decode in decode_text:\n",
    "    print(decode)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "decode text\n",
      "[BOS] hello world [EOS] [PAD] [PAD] [PAD]\n",
      "[BOS] [UNK] text [UNK] with batch [EOS]\n",
      "[BOS] this is a test [EOS] [PAD]\n"
     ]
    }
   ],
   "execution_count": 36
  },
  {
   "cell_type": "code",
   "source": "train_data[0:1]  # 切片是为了保持为ndarray格式，直接train_data[0]就变成一个list",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T03:13:07.255820Z",
     "start_time": "2025-02-04T03:13:07.251641Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([list([1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32])],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 37
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:14:38.255312Z",
     "start_time": "2025-02-04T03:14:38.250971Z"
    }
   },
   "source": [
    "# 看看训练集的数据\n",
    "tokenizer.decode(train_data[0:1], remove_bos=False, remove_eos=False, remove_pad=False)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[\"[BOS] this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert [UNK] is an amazing actor and now the same being director [UNK] father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for [UNK] and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also [UNK] to the two little boy's that played the [UNK] of norman and paul they were just brilliant children are often left out of the [UNK] list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all\"]"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 40
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据集与 DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:19:54.135250Z",
     "start_time": "2025-02-04T03:19:52.571882Z"
    }
   },
   "source": [
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "\n",
    "class IMDBDataset(Dataset):\n",
    "    def __init__(self, data, labels, remain_length=True):\n",
    "        if remain_length:  #字符串输出样本中，是否含有【BOS】和【EOS】，【PAD】\n",
    "            self.data = tokenizer.decode(data, remove_bos=False, remove_eos=False, remove_pad=False)\n",
    "        else:\n",
    "            # 缩减一下数据\n",
    "            self.data = tokenizer.decode(data)\n",
    "        self.labels = labels\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        text = self.data[index]\n",
    "        label = self.labels[index]\n",
    "        return text, label\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.data)\n",
    "\n",
    "\n",
    "def collate_fct(batch):\n",
    "    \"\"\"\n",
    "    将batch数据处理成tensor形式\n",
    "    :param batch:\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    text_list = [item[0].split() for item in batch]  #batch是128样本，每个样本类型是元组，第一个元素是文本，第二个元素是标签\n",
    "    label_list = [item[1] for item in batch]\n",
    "    text_list = tokenizer.encode(text_list).to(dtype=torch.int)  # 文本转化为索引\n",
    "    return text_list, torch.tensor(label_list).reshape(-1, 1).to(dtype=torch.float)\n",
    "\n",
    "\n",
    "train_ds = IMDBDataset(train_data, train_labels)\n",
    "test_ds = IMDBDataset(test_data, test_labels)"
   ],
   "outputs": [],
   "execution_count": 41
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:19:54.149212Z",
     "start_time": "2025-02-04T03:19:54.136288Z"
    }
   },
   "source": [
    "batch_size = 128\n",
    "train_dl = DataLoader(train_ds, batch_size=batch_size, shuffle=True, collate_fn=collate_fct)  #collate_fn是处理batch的函数\n",
    "test_dl = DataLoader(test_ds, batch_size=batch_size, shuffle=False, collate_fn=collate_fct)"
   ],
   "outputs": [],
   "execution_count": 42
  },
  {
   "cell_type": "code",
   "source": [
    "#要看到每个batch的长度不同，需要修改batch_size为12\n",
    "i=0\n",
    "for text, label in train_dl:\n",
    "    print(text.shape, label.shape)\n",
    "    i+=1\n",
    "    if i==50:\n",
    "        break"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T03:29:32.979128Z",
     "start_time": "2025-02-04T03:29:32.240895Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n",
      "torch.Size([128, 500]) torch.Size([128, 1])\n"
     ]
    }
   ],
   "execution_count": 46
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "# target output size of 5\n",
    "m = nn.AdaptiveAvgPool1d(1)  # 自适应平均池化\n",
    "input = torch.randn(1, 3, 6)\n",
    "output = m(input)\n",
    "print(output.size())  # 可以看到最后一维变成了1\n",
    "output = output.squeeze(0)\n",
    "output.size()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-04T03:43:42.840522Z",
     "start_time": "2025-02-04T03:43:42.835585Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 3, 1])\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "torch.Size([3, 1])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 62
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:44:29.661348Z",
     "start_time": "2025-02-04T03:44:29.647994Z"
    }
   },
   "source": [
    "class AddingModel(nn.Module):\n",
    "    def __init__(self, embedding_dim=16, hidden_dim=64, vocab_size=vocab_size):\n",
    "        super(AddingModel, self).__init__()\n",
    "        self.embeding = nn.Embedding(vocab_size, embedding_dim)  # 词嵌入\n",
    "        self.pool = nn.AdaptiveAvgPool1d(1)  # 自适应平均池化,对应tf是全局平均值池化\n",
    "        self.layer = nn.Linear(embedding_dim, hidden_dim)  # 全连接层\n",
    "        self.fc = nn.Linear(hidden_dim, 1)  # 全连接层\n",
    "\n",
    "    def forward(self, x):\n",
    "        # [bs, seq length] [128, 500]  [128,500,10000]--->[128,500,16] 10000(one-hot编码)个词变为16（embedding_dim）\n",
    "        x = self.embeding(x)\n",
    "        # [bs, seq length, embedding_dim]-->[bs, embedding_dim, seq length]，尺寸[128,500,16]--》[128,16,500]\n",
    "        x = x.permute(0, 2, 1)\n",
    "        x = self.pool(x)  # 每个样本变为一个密集向量，在seq_length维度上进行平均池化，[128,16,500]-->[128,16,1]\n",
    "        x=x.squeeze(2)  # 把长度为1的轴去掉：[bs, embedding_dim, 1] ->[bs, embedding_dim]\n",
    "        # [bs, embedding_dim] -> [bs, hidden_dim]\n",
    "        x = self.layer(x)\n",
    "        x = self.fc(x)  # [bs, hidden_dim] -> [bs, 1]\n",
    "\n",
    "        return x\n",
    "\n",
    "\n",
    "for key, value in AddingModel().named_parameters():\n",
    "    print(f\"{key:^40}paramerters num: {np.prod(value.shape)}\")  # embedding层16*10000，全连接层64*16"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "            embeding.weight             paramerters num: 160000\n",
      "              layer.weight              paramerters num: 1024\n",
      "               layer.bias               paramerters num: 64\n",
      "               fc.weight                paramerters num: 64\n",
      "                fc.bias                 paramerters num: 1\n"
     ]
    }
   ],
   "execution_count": 63
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "### evaluating"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:48:20.697415Z",
     "start_time": "2025-02-04T03:48:20.612045Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "\n",
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    pred_list = []\n",
    "    label_list = []\n",
    "    for datas, labels in dataloader:\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device)\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)  # 验证集损失\n",
    "        loss_list.append(loss.item())\n",
    "        # 二分类\n",
    "        preds = logits > 0\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "\n",
    "    acc = accuracy_score(label_list, pred_list)\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "outputs": [],
   "execution_count": 64
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### TensorBoard 可视化\n",
    "\n",
    "\n",
    "训练过程中可以使用如下命令启动tensorboard服务。\n",
    "\n",
    "```shell\n",
    "tensorboard \\\n",
    "    --logdir=runs \\     # log 存放路径\n",
    "    --host 0.0.0.0 \\    # ip\n",
    "    --port 8848         # 端口\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:48:29.266617Z",
     "start_time": "2025-02-04T03:48:29.111718Z"
    }
   },
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)\n",
    "\n",
    "    def draw_model(self, model, input_shape):\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n",
    "\n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\",\n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        )\n",
    "\n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "\n",
    "        )\n",
    "\n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss)\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc)\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate)"
   ],
   "outputs": [],
   "execution_count": 65
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Save Best\n"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:48:35.842938Z",
     "start_time": "2025-02-04T03:48:35.838157Z"
    }
   },
   "source": [
    "class SaveCheckpointsCallback:\n",
    "    def __init__(self, save_dir, save_step=5000, save_best_only=True):\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch. \n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir\n",
    "        self.save_step = save_step\n",
    "        self.save_best_only = save_best_only\n",
    "        self.best_metrics = -1\n",
    "\n",
    "        # mkdir\n",
    "        if not os.path.exists(self.save_dir):\n",
    "            os.mkdir(self.save_dir)\n",
    "\n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        if step % self.save_step > 0:\n",
    "            return\n",
    "\n",
    "        if self.save_best_only:\n",
    "            assert metric is not None\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))"
   ],
   "outputs": [],
   "execution_count": 66
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Early Stop"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:48:39.715175Z",
     "start_time": "2025-02-04T03:48:39.710539Z"
    }
   },
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute \n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "        self.best_metric = -1\n",
    "        self.counter = 0\n",
    "\n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter \n",
    "            self.counter = 0\n",
    "        else:\n",
    "            self.counter += 1\n",
    "\n",
    "    @property\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience"
   ],
   "outputs": [],
   "execution_count": 67
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "### training"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:51:43.662650Z",
     "start_time": "2025-02-04T03:49:18.271322Z"
    }
   },
   "source": [
    "# 训练\n",
    "def training(\n",
    "        model,\n",
    "        train_loader,\n",
    "        val_loader,\n",
    "        epoch,\n",
    "        loss_fct,\n",
    "        optimizer,\n",
    "        tensorboard_callback=None,\n",
    "        save_ckpt_callback=None,\n",
    "        early_stop_callback=None,\n",
    "        eval_step=500,\n",
    "):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for datas, labels in train_loader:\n",
    "                datas = datas.to(device)\n",
    "                labels = labels.to(device)\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                preds = logits > 0 #当sigmoid输出大于0.5时，预测为1，否则预测为0，这里大于0，刚好sigmoid的值是0.5，预测为1\n",
    "\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())\n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "\n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step,\n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            acc=acc, val_acc=val_acc,\n",
    "                            lr=optimizer.param_groups[0][\"lr\"],\n",
    "                        )\n",
    "\n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=val_acc)\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(val_acc)\n",
    "                        if early_stop_callback.early_stop:\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "\n",
    "    return record_dict\n",
    "\n",
    "\n",
    "epoch = 20\n",
    "\n",
    "model = AddingModel()\n",
    "\n",
    "# 1. 定义损失函数 采用二进制交叉熵损失, 先对logicts做sigmoid再计算交叉熵\n",
    "loss_fct = F.binary_cross_entropy_with_logits\n",
    "# loss_fct =nn.BCEWithLogitsLoss()\n",
    "# 2. 定义优化器 采用 adam\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "if not os.path.exists(\"runs\"):\n",
    "    os.mkdir(\"runs\")\n",
    "tensorboard_callback = TensorBoardCallback(\"runs/imdb-adding\")\n",
    "# tensorboard_callback.draw_model(model, [1, MAX_LENGTH])\n",
    "# 2. save best\n",
    "if not os.path.exists(\"checkpoints\"):\n",
    "    os.makedirs(\"checkpoints\")\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\"checkpoints/imdb-adding\", save_step=len(train_dl), save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=5)\n",
    "\n",
    "model = model.to(device)\n",
    "record = training(\n",
    "    model,\n",
    "    train_dl,\n",
    "    test_dl,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=len(train_dl)\n",
    ")"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/3920 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "806384118873413dbd32cdb71b8bfb0b"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 15 / global_step 2940\n"
     ]
    }
   ],
   "execution_count": 68
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:53:00.716338Z",
     "start_time": "2025-02-04T03:53:00.490950Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=500):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()\n",
    "        axs[idx].legend()\n",
    "        # axs[idx].set_xticks(range(0, train_df.index[-1], 5000))\n",
    "        # axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, train_df.index[-1], 5000)))\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_learning_curves(record, sample_step=10)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0IAAAHDCAYAAAAJLaogAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnQW4G2X2xt/Ydevtrbs7VSiFUoq0heLusCywiy22LO4ssCyysMACyx8Wh+JaKrS0pVB3d2+vu0b/z/mSSb6ZTOxq5PyeJzfJ3Jlkvth875xz3mNwuVwuMAzDMAzDMAzDJBDGtt4BhmEYhmEYhmGY1oaFEMMwDMMwDMMwCQcLIYZhGIZhGIZhEg4WQgzDMAzDMAzDJBwshBiGYRiGYRiGSThYCDEMwzAMwzAMk3CwEGIYhmEYhmEYJuFgIcQwDMMwDMMwTMLBQohhGIZhGIZhmISDhRDDMAzDMAzDMAkHCyGGYRgmplm0aBHOOussdO3aFQaDAd98803IbRYsWIAxY8YgOTkZ/fv3x7vvvtsq+8owDMNED2bEAE6nE4cPH0ZmZqY4yDEMwzCtg8vlQlVVlRAZRmN0njurqanByJEj8cc//hHnn39+yPX37NmDM844AzfeeCM++ugjzJs3D9dffz26dOmCadOmhfWcfFxiGIaJ/WOTwUWPFOUcPHgQPXr0aOvdYBiGSVgOHDiA7t27I9ohUfL111/j3HPPDbjOvffeix9//BEbN270Lrv00ktRXl6OWbNmhfU8fFxiGIaJ/WNTTESE6IybMtisrKyIt7fZbJgzZw6mTp0Ki8WCeCFexxXPY4vXccXz2OJ1XOGOrbKyUkz4ld/heGDJkiU49dRTVcsoEnTHHXcE3KahoUFcFJRziBRdasxrQ6/9L7/8gpNOOikuP1fxOLZ4HVc8jy1exxXPY7OFOS6KBvXp06fJx6aYEEJK2gGJoMYKobS0NLFtvH1Y4nFc8Ty2eB1XPI8tXscV6djiKf0rPz8fnTp1Ui2j+yT66urqkJqa6rfNM888g8cff1xXVNFr2Bhou2XLliEeidexxeu44nls8TqueB5bWhjjqq2tbZZjU0wIIYZhGIZpS+6//37cddddfpEyiqY19gTd3LlzMWXKlLgU2PE4tngdVzyPLV7HFc9js4U5LvoNbg5YCDEMwzAJRefOnVFQUKBaRvdJ0OhFgwhyl6OLFjpQN2US0tTto5l4HVu8jiuexxav44rnsVlCjKu5xhydFkAMwzAM00JMmDBBOMXJ0BlIWs4wDMMkDhwRYhim0VDBuN1uh8PhEOFss9mM+vp6cT9eiNdxEfTeke1oDJiHBqW6uho7d+703icDg7Vr1yI3Nxc9e/YUaW2HDh3C+++/L/5Pttmvvvoq7rnnHmG5PX/+fHz22WfCSa45kb8fifS5ioexmUwmMYZ4qo1jGMYfFkIMwzQKq9WKI0eOeAsWadJHKUfk7hhPk4d4HZcyNuqdQyKhW7duSEpKQiyycuVK4TCkoNTyXHPNNaJRKn1O9+/f7/0/OQ2R6Lnzzjvx8ssvC+vV//u//wu7h1Bjvh+J9rmKh7FRwTZ9P2L1e8EwTGhYCDEMEzHUTJLOutNZU2pmRhMFmvzQmfmMjIyobbzZ2LHG47gIOltfUVEhGpLS+zlgwICYHOPkyZODRrVIDOlts2bNmlb7fmgFQTx/rmJ9bPRZIiFbVFQU098LhmFCw0KIYZiIoUkCTXbINUuxDqb7tDwlJSWuJg3xOi5lbJTGRCYBdPZeGSfT/N+PRPtcxfrYyDSDirH37dvH3wuGiWNi8xeKYZioIFYnOYwafh9bBn5dYxt+/xgm/uFvOcMwDMMwDMMwCUejhNBrr72G3r17i1Dx+PHjsXz58oDrUh425UZrL2eccUZT9pthGIZhGIZhGKb1hNCMGTOEI8+jjz6K1atXY+TIkcJpp7CwUHf9r776SjjnKJeNGzeKAtKLLrqo8XvNMAwTBdAJoZdeeqlZHmvBggXiJFF5eXmzPB7DtDV9+/Zttu8HwzBMVAihF198ETfccAOuvfZaDB06FG+88YYoBn3nnXd016c+DmSjqVyoaR2tz0KIYZi2gKLUd9xxR7M81ooVK/CnP/2pWR6LYeLt+7Fs2TL+fjAMEz+uceScsmrVKtGcTi4mPPXUU7FkyZKwHuPtt9/GpZdeivT09IDrNDQ0iItCZWWluCZ3I7pEirJNY7aNZuJ1XPE8tngZF+0/WcySOxRdCMW+WFkezQTbR/of2UpTM0XlfqBt2rdvL66bY7zKY8ivaUsjj40u9L5SxF4m1j+rTPOi/X4Eo0OHDmw4wDBM/Aih4uJi8QPYqVMn1XK6v3Xr1pDbUy0RpcaRGArGM888g8cff9xv+Zw5cwJakYbDe9/OxdyDRqSbgQv7RvdELRIoyhavxOvYYn1cNAmiCC/1CqETJDQ5qre5v1N1Ja2b2pViMYbdtPHmm2/GwoULxeXf//63t+bxlltuwWeffYannnoKmzdvFim91GD0wQcfFM06qSnmwIED8cgjj4gz5gpHHXUUbrrpJnEh2rVrJxp00m/V/PnzRTPGJ598EtOnTw+5b0rjzaqqKu/k8bvvvhO/h7t37xa/s3R2/dZbb/VuQ01AX3/9ddEQlSywJ0yYgPfee0/879tvv8Wzzz4r+qCQFTDt60cffaR7Eor6CNXV1WHRokWw2+26+8U0DfqO1Nkc3vskduusDpit9hYXC6kWU1jfkT/84Q/e7wd9jon//e9/IgNk5syZeOihh7Bhwwbx+SZrcEqTX7p0qfj8DBkyRHxW6cSonBpH0SUlwkT78NZbb4lmtrNnzxbfsRdeeAFnn312yH2juQd9/ul7lZ+fj549e4rv8+23365aj7JT6DF37twpMlIuuOACvPrqq+J/lHZ677334ptvvhH9s/r3749//OMfOPPMMyN+TRkmkVm4vQjvLN6DZ84fga45qYhlWrWPEAmgESNG4Jhjjgm6HkWclM7gSkSIfnSnTp0qDvaRQmc0v/xxLl7dkowaq/tA9NwfTkL7jOSIHmdHQTVW7S/HxWO7wWhs+27ZNC6aUE+ZMkX0O4gn4nVs8TKu+vp60XeGGiaSaUqt1Y7Rz7aNuNv42BSkJYX3U0aiZ+/evRg2bJj3ZMumTZvE9d///nf885//FJM3EjQ0vrPOOktM7kgckDi67LLLsGXLFjEJI2gCS+OXf5eee+45MbmiNGKagP35z38WYoQmZcFQTvJkZmaKx6PoO01AqR7z4osvxu+//y5EEDXopAkrCbT77rtPCJ/jjjsOpaWlWLx4sdiW6jGvv/56IYTOPfdcIa7of/TY9J7Jk3P6H4kjEkuTJk3y65eiROSZpkEiaOgjs9vkuTc/MS2s7wiJn+3bt2P48OF44oknVN8P+qw9//zzqu8HCXw6eZCcnIz3339ffF+2bduG7t27B3wO+t7R94y+J6+88gquuOIK0asn1PeDhCM97ueffy4isfR9IGFEJxvo+0HQSQGaO9D37/TTTxdi57fffvNuT8vo8/7hhx+iX79+4qSHNgLKMExornnHbZL20Dcb8c4fjkbCCKG8vDzxo1FQUKBaTvfp7HAw6IzRp59+6v1xDQb9qNJFC00cGzt53FJu8Iog4kiVDZ3b+SYE4TD91d/FdVZaEs4Z1Q3RQlNel2gnXscW6+Ois7N0dpeEgHJpKyJ5fprAJSUliYk/CQqCJn4E/TaR8Yv8ezd69GgxgSIxQJEdirL88MMPqqiM8jookEihyR1BIoomeyRaTjvttJDjkMdDReannHKKiEIRgwcPFpF3Otv9xz/+EQcPHhTjoLPpJHD69OmDsWPHen+TSbzR2fBevXqJZWRso0VJwVPcPPU+l7H8OWUiIzs7W3w/SJQrx3Ql24O+H3QCR4GEi/yZou/H119/LaKYFKkJBH0/6IQC8fTTT4vILGWLhPp+0OdQzhShzzul5FMkVxFCdDLjr3/9qypKdPTR7knazz//LJ6HTmRQdJcgUccwTOM5UlGPWCciIUQ/kHSgnTdvnjjLqBxI6b48MdCDzuJQ3c+VV16JVqV0D0zf3ooxhbkoMA7AaucAlCELB8rqMKpHDhrsTqRYQp8RcjrdufTEmv3lUSWEGKatodQbisxUVVYhMyuzVYURPXdzMG7cONV9Svt77LHHRBrP4cOHhfij9LH9+/cHfRxKQVMgoUIRmkCumsGgCds555yjWnb88ccLgUT7QpNSEjk0maNJJF3OO+88MYmlCSqJKIrAk7ijaPqFF14ohCDTNtDnlCIzCnTsbK3vS3N8R4J9PygCScK7pb8fFNGl1Dd6DnouSssdNWqU+B89Bn1P6XOvx9q1a0VESRFBDMM0HVMclABGnBpHYedrrrlG/ChSihsdlCnaQykcxNVXXy3yfulMqDYtjsSTUlzcWpRt+xXt9i3GhQAuTHIv2+PshOJ5I/H6nP6YXdET5007FddM7B80h/pQeZ33tjHMegSGSRTou0OpN/Ykk7iOxQJpbe3M3XffLdIYKY2Hzo5T4TedeabJVzC0ERR6bVrC/ICiQNTCgGy3qWaDIkc0MSUnu5ycHLHvlD5E/6OoFNU7kYsXnUln2u47okCfiVj6vgT6flC6HNXaUGolie2W+n5QRgk9J0VEqRaOPv+UXkefaYKePxih/s8wTOSY4mA+HLEQuuSSS1BUVCQOulSwSGdjZs2a5TVQoDM12h91yhmm/HQ6ILc28+sGYrntBowx7MA48w70wyH0MRagT+UcHI05uNkM1PycjNW/DMBye3/0GTUZC2p6o9SVicuO6YmTBncUj7OzqNr7mAWVgUOBVrsTFpM7zYRhmOiDItsUUQkF1RZQGg9FWSg1jn7XqL6otaDic6W+Qd4nOqOt1DWQaQUVp9OFaolIAFEx+fnnny9+gyiCRBf6vaboEaUuyfWXDNMc3w8lQtSS3w96PqqFk9Pudu3a5b1Nwoj6elGGykknnaQbiaJ0UkqF5agQE8tU1Nnw+HebcOZRauOytsAYBfXybWKWQGlwgVLh6OyklkGDBnltWlubacePg6VdN8xYsBaZJ4/BhpoyfP3Ddxhj3IGxxh042rIb6Y4ajHVuxFjjRmD9N6BM5d3Ozlizoz8exUAYuh+DLgPHeB/zYJm+i1J1gx1n/vtXZKSY8d0tE+PiA8Iw8QZNlugsMk3ayDgg0NnoAQMGCIOEM844Q0S9KTLUmrbgVOtA9Q1Ue0EnoKgegswX/vOf/4j/U60SucmRwQGlvJGrF+0f/d7S+GhCSClxHTt2FPfpBBaJK4Zpzu8HGSSQ6H744Ydb9PtBz0eGDOQ2R1HNDz74QEQ/5QgnRURvvPFG8ZlXjBFIQP3lL3/BiSeeKL4rVDdHRiYUxaL6J9r3UPVJDBNNvPTzdny15pC4vDyhbffFGAcn/aM/Ht9EMpLNOH14Z1zc14kpQzuic+cuWOgciX/ZL8S/uz6H5AcPoPiqBVgz8nF8Zj8RO53uAuq+xnxcYFqMx03v4LEjN+LKBSfgY8vfcbd5BnoUL8LmnXtgczjx1eqDKK529zz6dPl+7C2pxcZDlapUOoZhogdKr6GICjWEpnS3QDUNNFkigTFx4kRR3E21NmPG+E6ItDT0XFQITilB5OJFUR0qWKez8ARFf2gievLJJwuBQ82tP/nkE+GIR3UXZIVNrl509ptsjymliCaHDNOc3w+K0pAYaunvB7kvUqSTTgqMHz8eJSUlfqYMlLZP6fp0soC+B2SLvWPHDu//v/zyS3Fygb7PNL577rknrOgXw0QTh9t4fml3OBM7NS7W6ZHr60M0oV97wGhCXr/R4lIy6DJM/WAlbjwmF7cOLMfcOd8jt3QdRhl3IdNQh+NMm3EcNlOHDuDDZ7HMcBQerLsDU0b2xYsXj8T/fvOlBWw+Uql6LoZhogMSBtoG0Iq40J4ZpzQzxTWOxIU2Eq5NBdKLfFPvknCg/kTa7ensNV30IIGmF4EnSBhRyjLDtPT3Q4b6cRFKZIgilnKqfFO+H+QkSz2N6CKjrUcmwUQXPcjpjswWGCaWMbexQ0GN5MAcA+WNIUk4IdQ5y9cjY2wvtYPSqUM7Yc0jU5GVYhbh8nOGnS7c4m77ZCV2bFyJcaadGIXtGG3cif7GwxjvWo9bzd/guXWX4pQhHVVRoC1HKjFtWHBLcYZhGIZhGIYJF0sbl11UN/iabtscbVP20pzEgZaLDJPRgGcvGIHbThmAEwbk+f0/O9WiMjqgOp9XrzgaL912BS658WH8zX4jTrU+jz9Z7xT/v8H0I/oaDuOOGWvF/S7ZKV4hxDAMo0C1C1RzoXeh/zFMIsPfD0aP//22Bx8t29cmz03GWI9+uxE7Cqr8/vft2kN4ZZ4v7TKRIkLV9T4hVCtFh2Te+30vPljSeuZCTSHhIkLEJUe7u8JHwpAu7s7xZxzVBT+uP4IO487Hzv3L0L/8dzxmfg9X2+5DstmEB6YPwV8+WYMtR/y/OAzDJC5U30P1F3pQ2h3DJDL8/WC0UP31499TOQJw4djuYo7Vmtzx6Vos2V2Cz1cdxOYn1IYatF+lNVacN6Yburdr3TIIciZuS6obbN7bdVafKFKorLfh0e82idvnjO6GrJTobsqdkEKoKTx+9jCcN6qbSIUzlL0Gx6vjMQkbcLpjOUZPvQYT+7ujTPtLa8WHoc7qwNLdJTjzqK4iGsUwTGJCTlZ0YRjGH/5+MFpo/qRgd7iQ3Moz1rUHygNGPWo9AqDe1vpmG/Jc0tkGmWnVDb4x67028vtWWWeLeiGUcKlxTSUvI1nUEon0udy+cBx3h1j+YvYM/Gl8J7RLT0Lv9u6zA9+vO4zxT8/D7Z+uxdzNBW285wzDMAzDMLEHCaHWxgVXyP1pixoZs+RQYGu9jg66qXGy6NETR+W1vuhRtMJCqIkknXgXkNMLqXX5wKLnxLJJAzuI6we/3uhdb2s+1wwxDMMwDMNEiq0Ve7iFgtwP7Z5QjKMNQjJyREgKzrRJalytzeHnBqlEy5Tmr9EOC6GmYkkFTv+n+/aSV4GibZg0wC2EZPIr6lt/3xiGYRiGYWIQ6tWod7u10HF7x8fL9mPWxnzvfUUQtSay+LJ6XpafNhzBZysOiNubD1fi3/N2BE3b+2H9YXyx6mCjnr9KigjRvlg1740cJSqrtSLa4Rqh5mDQacDA04HtPwEz/4YJl3zp/Ve7NAvKam04WMYNVhmGYRiGYcJBFhltkRqnZWdhNR74eoNqmaMNIlWy8CDNQRGZmz5aLe5PHJCH6f/+1fv63TVloN/2JF7u+mydaIw6dViniGt4ajRhKBI+spEFp8YlKqf/AzCnAHsWIn3nd3hg+mCcNbIrnr9opPi33GOIYRiGYRiGCYwcBdJGHVoDVxiZPW1RI2SzS6+Lk14b3z6Qk50CRYb0aLA7YLU7hdFCRSOEipwap2eYIN/n1LhEol1vYOJd7tuzH8SfxnfEK5eNxsBOmV4hRM1ZGYaJbXr37o2XXnoprHXJVOWbb75p8X1imGj6frz88sttvRtMHCBHgdokIqR5Sr30vLaoEZL3o8FpgNXuEx5OKZ8vyazvVNwgOSxUSWlujWmoqieE6my+/5dJwixaYSHUnBx/u1sQVR0BFj4rFnXOTgHVtZH6Lq5paOs9ZBiGYRiGiXrszjauEdIoIb2oVFvUCMlRKNIgDXb918kSoPGqvH6NTh+gUGjFk9Y5TpUaxxGhBMOS4jNOWPo6ULhFfBA7ZaWIRYe4TohhGIZhGCaiCX84QujrNQexcm9pi5kl6EeE1MvIoODtxXtwoLTWu2zelgL8srXQb1tKS/vfb3tE49hIaNCkxsn36xT3BI3Ntnp7h64VdjhsOFiBH9YfUS179ZcdKKys1xVGgWqEdhZW4fHvN2HGiv1oa1gINTcDpwGDzgCcdmGcQN+kbjmp3iarDBOX0BHDWgPYat3XrXnRs/YJwH//+1907doVTs3B65xzzsEf//hH7Nq1S9zu1KkTMjIycPTRR+Pnn39utpdpw4YNOPnkk5Gamor27dvjT3/6E6qrq73/X7BgAY455hikp6cjJycHxx9/PPbt2yf+t27dOpx00knIzMxEVlYWxo4di5UrVzbbvjGt9B2RL631fQnzO9La348XX3wRI0aMEJ/3Hj164Oabb1Z9H4jffvsNkydPRlpaGtq1a4dp06ahrKxM/I/285///Cf69++P5ORk9OzZE0899VSj94eJLuR0uFC1OLuLqnHnjHX4yydrmu35tc+oJ4S0+/XMzC148ofNuO69FV4r6eveW4lr313hl1J212dr8fj3m3H9eyubUDulTnWTnyNgapwknKo0+xSK+75a77ds9qYC3Pvl+gBCSD81bsuRKvzvt734ctUhtDXsGtcSnPYMsGsesPdXYOOX6NdhIFbuK8ND32xEx8wUTOjXvq33kGGaF1stjP/ojpy2eO4HDgNJ6WGtetFFF+Evf/kLfvnlF5xyyiliWWlpKWbNmoWZM2eKSdj06dPFZIomVu+//76Y+C1fvhzDhg1r0m7W1NSISdyECROwYsUKFBYW4vrrr8ett96Kd999F3a7Heeeey5uuOEGfPLJJ7BareJ5RfNmAFdccQVGjx6N119/HSaTCWvXroXFEt0duxkJEj1Pd1WdhcyJsu9IY74fZ511FrZt2yZESKQYjUb8+9//Rp8+fbB7924hhO655x785z//Ef+nzzjtB4kwqjsym81i3xwO90Tr/vvvx1tvvYV//etfmDhxIo4cOYKtW7dGvB9M9PcOIoezYOzznGg+UlEvIh6yi1lj0fbHoRKHUDVC7y1xn7jaXuAW9LJIoXqZjGTftHueJ0q09kB5E2qE1Cl7cnQpKUBqnDyO6ggjQooZA5mBHSyrxZr97n3/ZVuRqrdQqNS4Ak8EicpH2hoWQi1Bu17ACXcDv/xdGCfcftWv2JJfifUHK3D35+sw965JSEvil55hWhs6o3z66afj448/9k70vvjiC+Tl5YloC03MRo50Oz0STz75JL7++mv89NNPTRZC9Jz19fVi8khnwIlXX31VTCSfffZZIWoqKipw5plnol+/fuL/Q4YM8W6/f/9+/O1vf8PgwYPF/QEDBjRpfximub4f3333nRD0kXLHHXeoTBb+/ve/48Ybb/QKIYr2jBs3znufUL6HVVVVQhzRd+iaa64Ry+h7Q4KIib+IUCjXuALJ0a2wsgE9ctOafX+0tTDh1AjJYq4xxgRhRYQkYVNU5RNCgfZMTo2riTAipPQmuu3k/njih83e5YM8xmDhpsaRYCVYCMUzx98GrPsYKN2Nrmtfxqd/ehxTXlwk3ONe+2Un/jbNPZlhmLjAkgbnfQdRWVWFrMxMMWFqzeeOBIqsUNSFJld0Vvujjz7CpZdeKvaZzng/9thj+PHHH8XZZYrS1NXV4eDBxjWek9myZYuYRCoiiKDUN0rvoTPqkyZNwh/+8AcRNZoyZQpOPfVUXHzxxejSpYtY96677hIRpA8++ED8j87eK4KJiQHoc0qRGQ/0vrfa9yWC70hjvh8k0hsDpdU988wzIopTWVkpHo9OFtTW1opUOIoI0ec80PepoaHBK9iY+EOOAoVyjVMm1srtlhBCcqRDr0ZIdkhTSiLk/S6vax4HNdku2+o0qIRNoSSE9CJYfq5xDZEJoTrPa5BiMansxPvk+Y5rlA4op8ZRZE3JbFDIVyJCnhr6toRrhFoKczJw+nPu20tfR1rZdjx85lBx9/0l+/xyRRkmpqEfOUq9oQkXXbfmRfMDGwqKwNAPM03mDhw4gF9//VVM/oi7775bnOF++umnxXKaiFENg83WOs43//vf/7BkyRIcd9xxmDFjBgYOHIilS5eK/9EEdNOmTTjjjDMwf/58DB06VOwrE2PfEfnSWt+XCL4jjfl+UBpnpOzdu1dEP4866ih8+eWXWLVqFV577TXxP+XxqJYuEMH+x0Q3Gw9V4M2FuzB7U37Q9WxStEVbn0NzKDJHqKy3qVKt5El2U3GFExGSRMnag74UtySz0W+/G9OzJ1QfobUlBqw7WOG9X1TlG7scKZJpaERq3Kp9pVi2uwT1HhGVbDFiR2G1rm237BpHEbMandctP4oiQiyEWpIBpwJDzgJcDmDm3Zg6pCP6dkgX4dFPl7e9UwbDJCIpKSk4//zzxZluqsUZNGgQxowZ4y3MpqjMeeedJyZ4nTt3FhO25oDS3MjwgGqFFOj56Ew77YMC1QFR7cPvv/+O4cOHizQlBRJGd955J+bMmSPGQMKJYWLx+0HCh6JiL7zwAo499ljx2T582BcxI0gkzZs3T3d7Sg0lMRTo/0z0QkYCz/y0FX/+YJUwOQgnIiSLIuKeL9YJc4TbPeYIckQov6J5HHq1HiPafjliH6X92nKk0i8qIpspNJeVtCyuiuoN+OfsHboRITlSFNA1rsEW1vNd/fZyXPqW+6ScEhEa16ud7j5pBaOeYQILoURi2jOAORXY9xuMm77A9RP7isUvzt2Orfn6XX8ZhmlZ6Aw3nfF+5513vGe7lcnVV199Jc50k2i5/PLL/Ry0mvKcNMmkeoaNGzeKom8qTL/qqquEC9eePXuEAKKIEDnFkdjZsWOHEFCUfkQ1GOQqR/+jCSkZLsg1RAwTS98PcnqjSOsrr7wijBIo5fONN95QrUPfB/qck4nC+vXrRQodmYUUFxeL79K9994rzBWo7o4c7Sh6+vbbbzd5/EzLQdHGgsoGv+L7kK5xmujGzA35qiJ9VUSooqFF9juUEKqX/q+sKwuEsgAOapESzEpcrhGSU+AC9hFq0BdLMhQ1oqiOLAxTLSa8ePEodPUIGVnwaV8npa5IwemkzwCnxiUOOT2AE//mvj37QVw8PBMnDMgTH5RHvt3U1nvHMAkJWVjn5uaK2hyazMl2vlQwTqlplCJE9TrK2fCmQjUPs2fPFi5cZDt84YUXivoGKvZW/k8TvQsuuECcHSdr7VtuuQV//vOfhUtcSUkJrr76avE/qh2iovbHH3+8WfaNYVr7+0H1cvR4ZBRCkU+KQFG9kAx91umEAIkuspUnx8Vvv/1WuMcRDz/8MP7617/ikUceEScFLrnkEuHGyEQv2nStYLbYKte4EIJbFRGqbP6ejeQOV6fTfNQhiRKHpBSUqIgs5potNS7Ia6aqEXI0T41QrUbImIwG0SOzZ/s0POQp+ZCfS7u+kk6nUFJjFQLSaAA6ZCajrWGzhNZgwq3A2o+Bkp0wL3oWj539EE55YSHWHSgXoV9zAItDhmFaBkpH06bhKM5VVH8jc9NNN4lCboVIUoG09quUTqR9fAWKCgWq+UlKShJpSgwTbd8PEusy9P0QRhDSdyYQlOZJFxmKkMqceOKJIgIaaD8ffPBBcWFiA22UQms/Hdg1LvB6JDoqpLQzuYi/uSDxESoipL1NZgWyQAjkoBYpgWp/tK9nwIiQtE/VnhqrYGgFYIqn/okgQaQ1ZtCur40IKe9PXkayd/u2pO33IGGME/7pvr38TfSx7UZ6kkl8mPcU++oFGIZhGIZhYgmax6ze725yS4Jk4faigH1/6jV1K3LUJ1gKWLA+QlpzBFkIUTraiiID5mwuCJpSFrKHkMPpdUyTkcUPpXzJ0OtwwNPfSNmXQPy6owglnh5AZCaxLb/Kzxzil22FQnCEOw5tjdDvO4tRWFmPBmkc1VJEiOqa5m8t8BMuWgFI9UEKFpPbiIX267edxaKPkXZ9ckum/9V4xnCgrDZq6oMIjgi1Fv1PAYaeA2z+Fsaf/oYhnR/Byv3l2HS4EgMk/3WGYWIDSuWhtDU9evXqJRzeGCZR+eyzz4Tlux78/YgfSDCc9PwCcXv5A6fg+vdXip6J950+GDee6G/vr51kO4JEemSREWzyf8RjjkDNSmliX1DV4LVsfvLHrfh+pwkf7lyH5y8CLhzbPaxxafsD0URfLyIkR2C029zw/krV/WBmCVe9vRwdM5Ox6J6TcNEbS2A2GbDiwVO9ouPf83bgv4t24x/nj4hACPnW+2VrIa59dwVy05Nw3cQ+ujVCf/t8PX7ccAS3ntQfd08bFJYQUpq2bj5SiSv+bxly0iwweVwqUyxGkRZ3+6drVdunJbm37xQF9UEEC6HWZNrTwI65wIGluLzn71iJoeLDc+7obm29ZwzDRMjZZ5+N8ePH6/6PmqMyTCJDNWyTJ0/W7ZHE34/4YW9Jrao+hUQQ8cWqgwGEkHoSH6z2R+UaF0QwKYX35MpLz0/ihCI4yWYTDpb56oX2l4SfgaMVG3RfNzXOETgipCVUjRC9fmQeISJPNogT5WM9zmx7PdlD+0prvfs2dWhHzNlcGJYQmrnhiLimx5eXV0mpcSSCiA+W7lMJIa0LHFlnK1ikNDkl/Y+MFIj26ckiGqRFeR0zk6NDgkTHXiQK2d2BE+8Bfn4M0/P/g8fwLDYd9vm/MwwTO2RmZooLwzD+0HejW7durdtcmWl11h5wp8QRcjZZIFGgTS8LapbgCDci5BZCPXPTvEKMJvskhOTUr7IIanS0zUjp+XXNElSGDsGFUDiucfL+rj1Q7hVCSjSJmrYqr8sTZw/Fip0FKLPq9wmTU+BqpH1X22fbRfRM3vcBHTNUj6MVgIrQkSNCeu9xu3SLrhBSSJYepy3hX6jW5thbgLyBSLGW4k7zF9h6RJ0HyjCxhDaPmolN+H1sGfh1jW34/QvN2v3luhNs2UEtaGpcMLMEWWQEiwh5hFCP3DQ/ISOnfkXSx0dPCOlFhOT+RnJTUT3o+UN9prRCSBtNohochSSTAZ4sM/0xSOKR+lfqmSg4XW7hIs9FycRARumJpF8jFFhGtEtLCrxzntS5aCA69iKRMCcB058TN682zUGn2u3NZqnIMK2FktpSW+tLi2BiF+V95JSl5oG/H/GB8v7R/Flulqlle0GVOFMfCdRIlArXI4WMAJrLZIkm5esPlouJ7o6CalRHMBWhYn5Ks5In63LKVSCBoxVCwSI9svih9Lc5m/KxwRPx0YsIUU+bZE+qlrIvsrCgxp7KmKlwXwvNxZT3WevMZrWTfXbwGqFgos79GE5vamAg8wfq2aMXbVOiSXKfIBIhSUFm8SR4KDJHRhYl1daAwqa6wa56LiV6RJ9rMr/QRvFkAZNk1o9GETkhhJAcWWpLODWuLeg7GRh2PkybvsITlnexu+hSjO7Vvq33imHChvra5OTkeHt2UA8cOsBYrVbU19fHVToMWQHH47gIh8OBqqoqcaH+MPS+Mi3z/aDC7UT5XMX62ETzzNpa8f7R+zj5xUViQvjFn/1rAmmyOPVfi5BkNmL7308P6/ELq+px8gsLxe29/zgjon079pl54nrdI1ORnda0Exe/7SzBlW8vw9G922HF3jKYDCZcfE54Im7aS4tgNhogf6zliFCg1DhtjVAw8SCnxn2+6qC4EDNvO0G3RoiK70kIkYihtDB6H9VCyIafNubj5o9WY0zPHHx18/Gqx5n03C/iff72luORkWL2i65o++NoxVqo1DhF0KQmpaI+gAW2vL8HSuuEkxwZHCjRrEKNEEoO8pNNr8NnKw/gvq82qJaX1tj8xNd6SWBS9IgE7nn/+Q2nDunkTc9TSDGHjgiRWCJ35GDIkaW2hIVQWzHtKdRvnolxxu1YueZjoNdf2nqPGCYiOnfuLK6VyR4ddOrq6pCamuo36Ytl4nVcythqamrQpUsX7/vJtMz3I9E+V/EwNhJB9D5W1K0W9xdtL4a2/H/htiLdVKpgbM+vbtT+yNGUwxV1TRZCOwvd6VAkggiHK7z3arUnHU478ZdTrgKJAq2ls5xapiWQkcJ+yZJajgh1yU51153U24UIoEiG/PDldVZ8tfqgagwySi8isnieNkz9e1jbYNcVbXKNUCizBFnoaCNjehEhggTJcf3yvJ8vJSJEzUipsWmSkZ5T/30j8fbu7/5970pqGvz2qVSKaFK0bNH2IlHzRbbeAztlRJwaR+uEEjrRkhrHQqityOqK+Z3/iOlH/oMhG19A/cmXIyWLo0JM7EATHJpAd+zYETabTVwWLVqESZMmxVWKVbyOi7Db7aJB5qhRo2J6whoL349E+lzFw9hov7URUiPNPjXo9ZYJhRwki6SputyQszkaUUZSMyOTqYmWKMjpZIHqZfzts4P1EQpPTBV56mY6ZSd7i/dpX+ToivL6ZaWE/jwaYPATtnLD1nAaqgZCqdUJKIQa/IXQkC5Zfs+hvP8hgi7o3T4dWzU9iWTRo4ivKul53aly5d4Inpz+6OcaF+BzSJE5eT09OCLE4MjgP2D7oW8x0H4IX7x0M8564GPhcsIwsQRNFpQLTaxTUlJidvKjR7yOS5mwckF4y6J8NxLpcxWvY9PRQY0TQtJJB0qRyghT1MiuY8Fsp8NFFlbex3U4EeotC5TOpjJLCDM1Lph4CFRHo63VoZ8wStPLS0/2Tr4pNU4bXSERki5ZNtP+6s256O2RjQaCCiHZPtsVSUQoeGocpVqSGCMRcvrwLn7rKYJPr0ZoRLdsbDjkTnXTEyNyvZDynPJrpaTGKfy+qwSRuMYR9LrKKXR6hPp/axEdcakEpXfHHDxq/4O4fb5jNgq3LmvrXWIYhmEYJoSAUdAroA+F/CiBIgOhhIvNHnzSTXUzlOJEBgFygT1BJz/IcEHPzjkcYafnnkbIURQSQtT7Rpsupn18itzsl3oRhSOS9F4zqg+iiJ0ibMgqe2ehOwUxy+LSff7CSvXrIr8/tggiQiTY9pXUBHW2UyBTjVX7SgO2TlGE0DhPXQ4JEr33Senfk6wzix/aJcsr2vUsw7VRp+oGu8peW5sqp9V3qtS4AGYJFBEKFfEJFTFqLTgi1Ib0yUvHEucwfOs4DueYfkf2L/ehfuA8FFbZ0LO9zwYyHKigjooAzxrZFdmp8XMGjmEYhmHaCnkiTzUZWiIRMnopX5FsX1Hnm5xqIxZaETT+6XnISbOIs+75lfUqc4XXF+7CP2dtCyhyckPsh14/HW1qXGW9HZOfX4AbTuiDB88YGnC8z83eJi6vXT4GZxzVJSxHOT2jgU5ZbstnxTXuxg9Xef+XZgZcJrOIdJDrngK9LrLltgLp3YYwI0JUI3THjLX4Yb27GamSOijbVcvQusFQtiMhRG5v2uiMgsVkCJgaN7pnDr5bd1iIPhLCgaBojtXhTiHURs8IirLpidGUcFLjLCSEYiM1LjrkWAILoT8c1xtP2a5AtSsFWSXrMOO/zwjnEr0PfjBueH8lHvpmI/72+boW21+GYRiGSSTkyb2eEGpMapzV4dsmUIqUHvLZ/WC200t3l3gjSDTZJxbvLPb+P5AIampESGs5Tbz16x7V/UDjfX3hTr9lgSIseuJRsWpWhJBMignI8ZwgJpMJBVkUyWl4VN+nrREK1AyVhIIsgoi0UIU7Qaisd7/H2WlJ6JqT6rUq10Kpc+JamCW4Ife/04Z1xvljunujLcGauLbPcL9mVZoaIYWRPXJCprRpnQO9+2cyhrTHjhb7bBZCbQh92R47exhOPvoo/Mt+gVh2VtGbyEY1ZqzYH9FjKQ4oczYXtMi+MgzDMEyiIU+6dYVQI1Lj5El2o1PjggghvfocuQ+SMomOROQEWyfPM6GmupxQBBqvnugJVAelJ6ZSPeJDuMZpSDa5RHSMOFyuL4S0ETatENIaDATb7zA8EwKiRHAyk83ehqSUdqdFzyzhzlMH4o2rxor3VxGE5R6r7FcvH42zR3ZVPQbZcivPqed6OLJ7ACEkvcY0j9WLCokaoZCucSyEGA+ds1PwnmMa9hh6ItdQjatMc5EhFfQxDMMwDNP6yBESPYHRmIiQHDnROqAFg+yfw2pEqrOfmyUh1C6I7XY4wk475p6e9DK9iJCWQOPVG08g1zg9MZXmmVQHiggpJQOyiFKiZWK/NOLKPyIUqEbIf79DNVYNhtLjh/oYKVEsvQa6emYJcs2NInaVSA9FqbS9kdpnuNMJ86VaKSXFkOiTl+YVkDLalDc9w4TwUuOiQ4JEx14kOF2yU2CHGW9Yp4n7p5jWoCBAER/DMAzDMK2DPOnWm6zLwiFUHxk6805GBeoaofBT4yqkybhVY5ZAEQvFAVJvP9YfLPf+X4k06KHXNNRvHU2NUK/26WGLQmW8lFIVSLwpr1PgiJCOEPKERpJCpMbJyBEhlfW30+UXISKTAz2KNA5sYixBRGoolOchdzsl3Y/qrbQoURi5oarsgKd1w0u1mEWUSSbPExHK96QLkjDJSfV9Njpnp6JzVkrISI5Sr+Rvn80RISZMqAkY8YtjlLgeadiFmrL8Nt4rhmEYhklsZKGiF6FQRYyC2Ccv3F6EUU/MxePfb1ZFGyJJrZPrPWRR9uWqgxjz5Fy8vXhPwP0orrbisGfiH0wI1UWYGkf1IT3apeq6kQUTMdrohJJitvFQhXid7vpsXcCIkJ7gSk0yB68R0olsyPVCcqSKRFC4NUKHynyPoaCX0ROo95IW5XnoMbT7rDYp8JglSMOVRaD2dRARIc1+Kalx+Z7IWEayRfW+kAiijKXQQihAahzbZzORRISIQrTDJmcvGA0u9Clf0ta7xTAME1O89tpr6N27t+hfM378eCxfvjxoD6UnnngC/fr1E+uPHDkSs2bNatX9ZaKfenmCrJP6JUcngqVEPTNzi7h+9/e9sEqPKT9+JDVC8r489v0mcf33H7cENRko9thom3XO4EeUGietc8X4nt7JM9l1h9xWEUKaSbki7MjRjvh6zaGAkRU9RzYlIqTXF4iiJnpuutvzq7zvmfx60u1wU+OKPc1cZf5yygDRy0dGFp96/ai0kSkSTtoo1rheuUFrhJJDCCG5hxKR66ntKqho8D6nLLZIBIUXEdITQpwax0RAF48zCLE2Zby4Hl2/PGSYnWEYhnEzY8YM3HXXXXj00UexevVqIWymTZuGwsJC3fUfeughvPnmm3jllVewefNm3HjjjTjvvPOwZs2aVt93Jj5S44IJITlII6ddRZQaJ1k4y/tCDrS+53EFTFFTIjnBannCS41zr/P8RSPx93NHeGtEIooIaSblSmqcRVIJgfoIVepYWfuEkF5EyGeWIFNjdWBHYZVO3ZbTLzUukrqfjpnJ+P4vEzGmp89soJ0n+kL07ZAR8jFEapy0DTFteGd/ISS5xgVNjdOpEaIGtIQy1vRkkyra1z49STcipH2N9dIRqUZIMbAIRKjUudaChVAUIP8gdBh7lrieaFiH0mr9JmMMwzCMmhdffBE33HADrr32WgwdOhRvvPEG0tLS8M477+iu/8EHH+CBBx7A9OnT0bdvX9x0003i9gsvvNDq+85EL3IRva4QkoRDoIk74YKrya5xgVLjentqdIh9JbUBnd/qbPaAka3GRIS84sMzodXrRaNFEX6BIkJmKbqgTY1TbJr1IkI+1zj/aS0t0kZX8jxGAWs9jruhUuMiSXFT3AVlgSAbVOQGSU1UEKlxmn0+aVAH723F/U4erioipHkd0pL8a4QU+2z5OeX3kBrUKoYKwdCrEUoyhU6Nixb7bLYmixJevnQUdhVW45ST+6F8SSZyDFXYvf035I2b2ta7xjAME9VYrVasWrUK999/v3eZ0WjEqaeeiiVL9NOMGxoaREqcTGpqKhYvXhxwfbooVFZWelPs6BIpyjaN2Tbaaemx0aTZ3b/E4DUfCGYJ3RSq6nzvubCHtqjHJQuhBqsVtgCzKjmiIDckrW2wic+vdgw0EdeOSU6No8fwvs7SJH7l3hLU1OvXs1TVWsU2wcRXdb3+51nenxqr+/8Wo0usaza4x1bl6YGjpaauwbttvWfs6ZpoAb0+9FhGSTAq68piglzVlF47MslG9/ti0Uk7a3ACGZp/HNunHX7YkI/V+0pxweguqteMnrfeqj9JJ3ESqFmqgsvpdL8uUnQrWxJQWVS0FIJkowsZUgEQias86gzrYXdxjfv1koZlhMP73smRNXHf4ESKWb0si140CXpP9klRPXos7esmltt9nz094wuCdJjJEFhwi02c9DiGRv9+NNfvCwuhKOGcUd28t9cmj8XkhgUw7JwDsBBiGIYJSnFxMRwOBzp16qRaTve3bt2quw2lzVEUadKkSaJOaN68efjqq6/E4+jxzDPP4PHHH/dbPmfOHBF5aixz585FvNISY2twAI+vNqFbugu3DHXi3e1G7Kgw4MHRDkjzxGZjRRFN1NwT1737D+DYfr5xkbapl5TP7Dk/IyvAyf6qKnoM96Rv63ZqHuqehK7buBmXLt+CrRUG3D/SIbbfUGrA29uMuLSfE8d29NSwOChq4XuujZs2Y2a5uzZo/2Gj9/G+W7wO7kCKvzBcumoNcMCF0nLfvmjZvH0XZjbsUC1bXmjAR7tMuHagA6Pau1BU6t5+/aoVqN0JbCpxv0bFFTW6j3vUE3MxqbML5/Z2oqTCvW1laaFqHxtsdsycORMHD/rGkl+ufrwkJ4kVA0qr6/yeZ/OGdbAcXos9B33vl5yWuH0jpbz6Xr+MmkNivV+3HMTMpH3YVCa/zwdRKt5HHXFtpUydIEU+AFatWI7K7S6Ul/jGUl5Az+extC6hfo+BhTulu82e9RMOVMO7z5lmp1iWbDShwel+fvocysGYeXPneO+XFPqe2wAX5s2ZjX3S4xHrV/yuul9RXABrPT2A+0Ho/dhR7v96rlixAtU7fIK1VvpsK+zbsxO/1tHnSP9LSeL5p59+atLvR21t82RNsRCKQnZkH4/JhQuQc/CXtt4VhmGYuOTll18WqXSDBw8WkQUSQ5RWFyiVjqJNVIMkR4R69OiBqVOnIisrK+Lnp7OZdKCfMmUKLJbAfV1ikZYc27wthahZvhbbKwyYPv00PL1xIartDeg76jhVTUZzUbniILBzs7jdsTM1pDzoHZeIDCyd71138skn6xaXE//avhiod0/cuvfqDRx2N03v2bc/flzodnvbm9IP9502CLc/PEfc/2SXCU/8wX0ydP3BCmD5Mu/j9R0wCNMn9xW3ZxSsBMpKxe2U3M7unjoFR/z2YcDgYZh+bE/8c8sioN7tFPbg9EF4f8l+HPC4n3Xq1gPTpw9Tbafsz/+2m7Djyal4ZtNCoL4BJ006XpgCJG8txLvb18ImJsw6fXVcBvxyxID/3nyad9sBvXtgTQmJAzdO0Ps5HfO/2ODd9zqHenLdo1Mu8veWoUGznJg44Wic0D8P+b/txY8Htvu2aZeK4zpVYfT44/Gvjb7X7+Kpx+HTN5ahzpWE6dNPgmlTAbB1nfhfXqfObnODIwdFJEaO5vXukocDO0sQjAkTxuOY3rn4qXIdNpa5m9yPHjYQC/NJAAPDB/bBFSdn46mftum2SslKS8b06ZNxsKwOz2/41f28nXIwffp4dD+qAjd/vBZ/mzoAU4Z1wOw5czGuZzbapSfjrDPczsPEMsdmrC456E2LO+OMaSKl8YfCpdhVVIPThnXCmdOG4Mk1C7zbDOzbE38b2RW3zViHB04bhOkjOmOKw4nf/m+FeB0pqre9oBp/ufgYVbTywyMrsLe6TDWG4UMG46wJPfHAynm6r1F6ivt1b8rvhxKVbyoshKKQ/A7Hw1FgQLvqnUD5ASCnR1vvEsMwTNSSl5cHk8mEggL3pEOB7nfu7CswlunQoQO++eYb1NfXo6SkBF27dsV9990n6oX0SE5OFhctdKBuymS/qdtHMy0xNrPZN22hx1bqcqxO9/3mRvYyUFr3KONqqFWnSBlN5oD7IFe7yKUvcpbajqJasT3VwijmCsrjbTwiTud7oWEr/2uQHrDW6oTRYAwYTRP77RnIT7efgCFdsnDDpP545edteOHnneKxgr2O9L86z4tCE3a6T5NaQlkebFvFlCBL6ldD0Hjp/7VBHqO9p7hfj6xU976kJfv2fdqwTnj10pEistE+02dKRa9v55x0r8EDfaYcUkSDypWU/SBBJDvD5YZRM5Ps+XzI7mrtM30COSMlCWeP7iEuF7+xBMv3ukWsAgkX2j5POr9C+0HLxvbJw7IHTxXLlNS4T24Y7/eedWuXrrIWVz6zc++aHLC5bVZqMsb364BlD7gfn6CH/fbWicHHq1MLRO9DRmpy0PqgUN/XUL8fzfV9Z7OEKCQ1Kw+rXQPcd3a4z8QwDMMw+iQlJWHs2LEivU3B6XSK+xMmTAi6LdUJdevWDXa7HV9++SXOOeecVthjprEoBfOEuz7IPWENZBDQVGR7a61ZgtYcwBHAtppwugKYJUiPT3bOhMXoPzVbe8Bd1O99DFVTVt9jVDXYAzq/KbVJygRYLq5XzAYiMUtQevcornHh4LXPDmA6EMxwQXZeC2iWIE3KSVAoyPbZNAlXTA9ISJM4k13jyCxBsQLPTVdPtvUas4ZjliBvJ5sLyCYavv02+RlKRNp8tJMUmVQeTwu9VknSexdur6Ng30nvY1uMItIe7c1UCRZCUQh92X9xjI5ICClfPIZhmESE0tbeeustvPfee9iyZYtwgaupqRHpbsTVV1+tMlNYtmyZqAnavXs3fv31V5x22mlCPN1zzz1tOAomFPLciiasStpSJI1Jg0HiKnBDVadqPa1dtN3pFMu1j+FeJu23NOmWJ/7U2JLGoe3zQ600VniiBkO7ZPntiyyEaAIvmzFo7aIJZdIv2xcrk2VZUGrHIcZIjmqe5xYpeBHYINPjBXKNU/4fzIJbK0pkFNEju6XJ9s00R8ryTPRFTx1JJNFzau2zlfdF23w2JwzHNz0hJItO2RlPz2hQ2W9ZSEQqHJT+lMGEkFaQZui8J+Gg10dYL0qk+n+sC6FImtYR5eXluOWWW9ClSxeRWjBw4EARqmQCf9nnOz1CaPdCwObfuViLKYjyZhiGiXcuueQSPP/883jkkUcwatQorF27VjRIVQwU9u/fjyNHfHUTlBJHvYTIapv6B1FUiBzjcnKav86EaT7kySE5rdkUIRSBDXUgCqvqcewz8/DsrK26IsPqSSlbsbcMY56ci4+Xuet85KjPrZ+swZR/LUKtR4zM3HAEo5+cK+o9FKopR81DqaZR55BHZqnESFFVA8b83bf90b3befZFvxcRTeADRcdoOYkNZVtVRMgzMVVexyd/2IwJz8wXr4nqMaTXwxeFCW8qKYsNvUn3sEdnY8OhioDba0WJjLL/8r4oQk0rYmi/yRpaca6j10w4Anqg14cia3rPKdtghxRCJt/zW6T9khuQypHCYMKFevw0NiIUrJ9PuvS42oar4aI3hlAujqlR0kyVMLZ00zqyhaSCp7179+KLL77Atm3bxFk7Ougw+tAXb6urB4oMeYC9Dtj7W8htOCLEMEyic+utt2Lfvn3C5poiPnSiTmHBggV49913vfdPPPFE0UiVBBG5zr3//vuiToiJbuQjHU1YlYhQc6TGvblwtyhef33BrqANVW/5ZC3Kam34fJW7GF2B0qx+XH8EOwur8cN6t+i++aPVKttrQrZ/LqvRt7pWWLi9yLv9yYM7okNmctCIEEU3AkXHKFIkNwoNlhr39uI9IkL18s8+BzmaZij/p9vK9uEKIWUcIjqjk2IW6j2U09u0KPsvT8C1gkIRMWkWsyoaoo0I0eequsG9r72lZrWh0vOCRYQo3fHCsd3F+3fBmG7BI0Ke/SOum9hHjPumyf0RCXIjVL2IjcKJA929iajH0OhGmo3oCSHlM3GRZ8xxlRoXadM6Wl5aWiqKUo8//ngRSaIDEAkoRp9c8UUz4DeDkh43O+Q2LIQYhmGYeEd28KJaF19qXOhmnqHQFo8HEkKBGqfKAkSp99Gjss4nhEo9QojStkjoaFl7wO3Gdcm4Hnj7mnHeaII1iBCq0bwWyvyAhIY84dcTDVoxsvlIpepxlP9TKpoSnQs3zYmEFdEpMzmiuiKFzJRgqXH+NUJKDZNCthQRkqNS5P7nXyPkHufE/nmqx0jXPKYeSl+dJCnFkeqCnr9oJJbef4o6vS5EROjhM4di9cNT0C3HZ/YQDnLETf68afn7uSOw4bGpWPnwqejXIQONQe/roAih5zxj1jZPjSYhZG7ppnXfffedKFal1Lhvv/1WOPVcfvnluPfee4XLjx6J3rgu09NEa7ZtJM41zYVr+2zYT33KryJNHpf8r1gZZzy9Z4k+rngeW7yOK9yxxeO4mdiF0uEU5El7c0SE7DpmB+oaIff/A513rJTqfXYUql3eZOSGnIoQImGhl/qlmCScMDBPCA9FCMmvQ700iSeKq61+kRBaRmlvDdJ4ZDGiTY3TE3T0/ErKn5xuFW5EKL/CY9GdneJXBxUOJBC0dtYKyuuSHCQipBgWaM0IqK5KFsEiIuR5j/p2UEeEwtlvo2dClqRTF6Q9aa0nIrT73dQT3XoNaMMVmGERokaI9p9qt+TPVkoUpcaZW7ppHRWizp8/H1dccYWoC9q5cyduvvlmcXCl9Do9Er1xnftEhBkLbEPhMJthKt+HRV+/jeqUrgHH5bT7GlrFU/1VrLxnkRKv44rnscXruEKNrbma1jFMcyCnhNU1txDSmZXqRYSUia6W8lqfANl4qELXbEB7hl6ZHNLkV6+uYusRtxAZ1cOdtqSsY/OIH9onrTDQ3qcIBAkhd0TI5xgn11vJESF5vxWDBaUWWXnN0xolhOq9hfxynUy4kAhJMRtV+6RFHREKkBqnCCE5NU6us2rwpRBS3QxFYw6Vu0VcOPtt9rj+ye9noAiYnmtcsJqexlARJCLUHOiNQTat0PuMpIQwU2hNWryPELnwdOzYEf/9739FBIgsTg8dOoTnnnsuoBBK9MZ19CP00Op5qLOnwNr9OKQeWITJXRvgPHZ6wHE9sf431NjdP8LUlCzWibX3LNHHFc9ji9dxhTu25mpaxzDNATmzKSgWx011jSPRctsna3DYE7Egrnp7mahtkKMtoYSQPOEsqbGqDBJklEJ87eRXT1CQOMvLSPamRikTamVf6jVn2eUIllYAyKlx2ufy1gjZHKq0OxkatiI45VSnUIXxCkeU1LislEZFOWjslFIVVAhJE3BtZMWXGmdWRYTumLFWtZ4SpVPW6d8xwyuElLS3YCju57L4CRRJkj7OAfe7qcjRw5bAGSQ1znffFLWuceaWblpHTnF0gJXT4IYMGYL8/HyRakf9H7Rw4zogNy1J5NOWdTtZCCHTrp9hOuEO3XVpTPKXjJq6xUvNUCy9Z5EQr+OK57HF67hCjS1ex8zEJjZ7gNS4JrjG3fXZWuwurlEt+3VHsbge18vt0ib37gl0eK3QmCKQEKLJcCBhIRMoIkQM6pzhjd5YzO5r5TEV4UP/poajyoRdJtvTvJTqqJTIh3YiqogCerzKOv16KxKA+0rdEeKOkitZuPU+6ohQ+HMUSk8rqKjHsK7ZIWtLgqXGje3VTrx3SnQtQ2q+GiwV7+Ezh2DJyyW4YGw3lfV1aLMEyTUuwHb6rnHNE6N49oIRuPfLDXj50lFoSZy6Zgkm3felV/s0HCitxWjPexANmBvbtO7cc89VNa0jtx49yCDh448/FutRPRGxfft2IZD0RBDjcyYhIXSgw0SIhLj9S4D6SiAlK6R9NuW3NndolWEYhmHaGpt0Cl0WQk0xSwhmvV0uRXkiiQgpzVIpQhGOEKIoRSBxINcOWQJEhGiiGagPjDoi5N9MlciS6kQUwaKF5vdr97trlkZ1z/YuJ5FGj6dEm84a2RX/OH8Ebvl4NRZsK/Kud8gTIeucnQqTTtPYQMy+Y5JI9yMRpE250iKLSdl9TXFI2/DYNK9NdEYIS2rl9ezfMRNrHpkihFEwe++grnEB3lu97EmtsUBjueTonjjzqK4+W2x6MqcDcDk81071bb9ldE336X11AeYUwJLquU4DTOawI0LKa3HOyK7484n9Gm3V3RJEvCeUsnbNNddg3LhxOOaYY/DSSy/5Na0ja2yq8yGoqd2rr76K22+/HX/5y1+wY8cOPP3007jtttuafzRxhNI47IixK9C+P1CyE9j9CzBUv+s5eeIr0I9uKlgIMQzDMPGFUhtDKIX77tuNjwgFq1eQ7a0V8RGobZ8smgjqTUOTd9kcIRDU80buOxNaCLlUQoieR26OqWf5XBckNY4m76kmF+ocBt2okjLPUFzsRmmslmUhRJN+mujKvY6IA2XuaFLnrJSQKWa926dhb0mtd8yKNghVWyJHIvQK8uUJeKDXy/t/aV1lO6X+JxjKiWm1EPLcphKGulKgtlRcj7WuRG9jJZJhQ7LBKq5HHVoD/JoK2BvcfSTp2l7vd22y1WFSSSHMh/4h/a8ecNi9YiZdFjp6rgZNwWgWguhdqxHVSRbUIQn1nkvHb/8LpKS7hZMlBbfUlWO/GRh7qAvSl3d1CylLCpDVHRhwKmJKCFHTuqKiItG0jtLbqHGdtmmdEvkhqLZn9uzZuPPOO3HUUUcJkUSiiFzjmMAoP3wiV3XANLcQ2j4nsBDSRIQYhmEYJt6QDQ3kSE6ThFCQM/ClkgGC0lA13IgQ7V84NSWhUuNypCaeShqacpxXUuNIIASKCCnbU/qgIlbktC2FdDNQ5wCOSLVSMlSTpfQCGtldI4ToNfQIPu0+KlCPJiU1TmvxrWVYt2yvEJIJle0iC7xQJQKhUuP0hJIc2UlBA3JRhXaGauQYqsTtHEM10pesA2zlGHfkEN6z7Ec7QxU6vWMH6ssBq9pW/Wn6o02O2uK5hIBGKhI3m9PPxmCi+grAYFTfJhShpeC0Aw2VYh/aaT+6+7ap7orKdXo593kuCj2Piz0hRFAaXKBUOGpap4Xss5cuXdqYp0rwXkJAGf0ID5wKLH0N2DHHHabUOSMhu8TIrjoMwzAME+3c+8V6EWn5xwVHBV1PTjNTer001SwhmJWvnLrkTY0LMMHW1giRSJHNDIKRGlQIBUmN86S60fYBI0Ke7WmeoNhC6xkzpNHmDSSE9FPjlChUz9w0tM9Q13HLj6fso9ybR6ZjVjIOlAafpwzvmi2a02oJZbtM+2GEE8mwIslaTm4vSGsoBIpoYm53R04cFD1pwJCKAzjbuEtEYpJgd0dlPJEZut+7zgT88KV7G2uNiOD0rCrGkuR8tEMVUgwB3Nh+c19RWUNXRbfJnjMkLFLbicv2Mhcq7SY0uCxogPsyqk9ndGmf405BMyd7ruXb7mu70YKVazZg3LETYaboi/J/o8U9TwwkavyWmTzLw0hXpDmowxOpEtGqetzy7mIcLi5DisGKFLgvL184GEnOesBG4qkO363chfyScpzYJwOD2pt923ccjLYmepL0GN0fLnKeEYo5KQOoKQTy1wFdPY1WAxSrcUSIYRiGiRUo/WzGygPi9r2nDfamcoXq9aNKjbM1vkYo3OaOiviQa3KD1gjZHLoubhFHhDz9b+SIhFWvRihAkb28vTi5GlAI0WtrwOEAqXEKAzr6N96Uo1GKELrj1AG47r2VqvUyk80ifU2vZmbSwA5YtL0Qf5rQFRcONOHL2QcxpqMR2DEXqK8QEZVL6rfiBHM+slCD9uY6pDhq0DfTDrzyqFjHXF+B3SmePpTvu6+m0J/N/uOYTJdgperkn6HefZD86yLteoPLjHJkoMyVKa5LXZmYOnYIzBntsb06CW8uL0cZMvDq9aciLbujWwCl5HhFx471R0QtlcxHk8aji6aRqx4umw0Fu01w9ZlErjZoFYwkmCjdzdfg9ezT0vHnD1apMu9eGzVd5SqyqWoL3ly0GyMmHwv0a49ogoVQlEeESqutWHekFsN6nwjz9h/d6XE6QogjQgzDMEws4gpghqCHfHxTmyU0PiIUrusZHWbpEtA1zk8IOb0Rm3DMEpJNoVPjLEofIY1rnLZGiOYQig001beQ8KCIjtLrSM++2FOaHFII6QlHssTe6mm+qjjbnTKkE5befwpOfO4XOO1WdDMUYbipDFhxELn5u/CKZRWyUYOuKQ3onW6HubgSrrQKGNbYgDXAz6Q6yJvgI9/znK2duZo8qWEB0sNcRjMcMMOUnAaDJqpSbjViU2GDNxIjLq4kWGEWt3t3ysWpI3q5t6GJf2ouSl0ZuPrTnShHJspcGahBijCaqJQs0bedeRrMZhMObi3Al0vdSsrU8xjy0PbbvzOO6oKxvU7BN2sP4R8/uftxxprZ1bRhnbHsgVPw/brD+PuPW3SjpnSC448T+4jPSbTBQihKUc6IzdqULy7P9x2OC/EjsGM2MPneoBGhQOFohmEYhok25BN5csQnVE+U5jJLCMfVTYEOr3IjUpnyOl89EVFZb9N1BVPo3i7V22soeI2QL2zh7SPkqVdS6qQoZUyOyozvk4ufNuZ7oz/kRGZz2FHmSd8LmBqHwKlxCnrRnK5ZSeiEUvQwFGJUyTZgwbdA2T50Lt+Hheat6GgqhdFAShKgqUwmucsp833aJbcZnactvCd9LCXb71JkS8G3W6tR6UrHiP49MWX0QM06WYCFivRTAFOyqCmjJvPUX1HbCmDLrhJc8Vbgso2re/bCqZOHq5Y5qxuwURgPSK9bkhmVkiGGYqggf04sQdLOOmenBLX9jgU6hRA4JIyiUQQRLISiuI+QzI91w3Ah3Ti0GqguAjI6qP7PESGGYRgmFpGPX6FSuwNGhGwO0Yw8kEgJhtJbJ6x9DSJslOiM0jtIib4EgmptwhNCklmCX0TI5xonb68SQhaTd7IePDUuuBDKQjV6GIowpmYn8NuvQNleoHyfEDxPlu7DMyme8e70XDyILpPUjNWVjAJTJ/TpPwx1Gd3x/LI6lLiy0KtbF9x55tE+IUPXVA6g815mWB34+yOzxO0LM7pjyqiRQV5hUi4B6ngoTS8C17hggkYrXJRgiLz3gerKvI8rRQPTNLbfTMvCr3aU0k6JUXvYXJMOdD4KyF8Px/a5MI25PKCTDtcIMQzDMLGCLG5CZTTYA5glUOSFhMi+0ho8+9NW/HXqIAzv5ut1I/P5ygP4eUsBLj2mJz5Ysg/bC9VOXnoTZsUCm4SQNoJE7mSymMvLSMLhinqvw1ogqLnk77tKxG2K2ARquqmuEfI4sjmcmLelAPd8sd7rGkeNKhWo940CiR5lsq7sk7bhJb2AHYxVGGYoRXdDMbobitBNc51t8Dw+lXO5S7pUk0m7y4jDrvYw5vZG9z6DgXa9xeW6bwuxtjoHJcjCkC7Z+OnyE2CtteHt3+eIbU9O7wj0OhrhIKeNbT4sOxBEjtyIXg+9Xjd628j7RHpHEeOB3AV190USSrGWGqcQLPoZzbAQivIaIYWiqgbYjp4CS/56zPv+A9QYJuHM4Z28Z6ecqohQjH4aGYZhmIRDFhFKw89AWKXjW53GIIFS5a78v+Uorm7Akt0l2Prk6bqP8TePeJi9qSCs/aMaEKpBohOOpNPkXkZEepJJlRqVl5kcUgjRvLdbjq/gnCI2gSJC2TpmCSQeZSMCmjyfPaorPl1xQESDZHc1EkKZySbkoQI5pUdwhnEfTim1Az++D5QfAMr3w1yxH38nZzS1GZwfRa4s1Gf0QI8+Q4B2vdxiJ6cXlpRl4MrPD8EBEx4eNxTXTezj3Wbrj/NRgjpVJEoWFGE6jHs5b3Q3fL3mkKg5aQry66+IWXoPlJPJJGi1UOStQ2ayEORKmqEcEZL7DA3tmhX2vjgkFRGLqXHE5EEd8NTMLX7z12iHhVCUIjdQI+g4sT37eAzDCzjWuRbjPluFnzd3x4ItJhw32ar6Elkdjc+VZhiGYZjWxO5sXERIWxdE90kEEYHc2gL1yAmVIlVqMsLudOhGhOj/KiHksZZWGqzSxPCj68djwbYiPDvLXRBPE265ZkKkxgWICJml5d4aIc0JTxI+x/VtjwVX56Frw16UbJyHp82rRCSnx8cP4/PyA0ii1DUKotD0grLm3JlzAkWLFLmycciVh4OuDihP6oyt9e289w+68lCHFNxwTB88eMZQ1fPnHKmEw/OASZqoiSzwFCGk7vETmRJ69oKj8KdJfTG4sy/q1RgyUyz47b6TxT5RRIaifle9vczbv2hEN3WvJGW/f7xtooh+jH96ntfoQkHOnKPPweJ7TwrY30lGro2j6GAsMqBTJhbcPRntdQRkNMNCKEqhsw50lqlG+qHfbOiHzq5MtDdUYRR24McN9PYZMGPFQWHtrm36xjAMwzDRjjypj6hGSEqN0zZYDcTa/Z6q/AggNzaKxJCusesIIW0KlRJJUGqEaGI7pEsWVuwtVQmaLtmpqohOoNQ4GWUdJYpGPXPGGrbj7PxvgZeXoHf5frG8C4DLld0qc185XQYUoJ0QNGkdemPY0BFAdg8gpydsGV3w5pxNeH5zmve5hnXIwqYa//Qzvf2kJqkKUoDPL+1LEUXyY0Ra1kWPQa9ncyBHhciUYr+UXjiwk79NONExU130n2bRjwgR3dv5Xs9wP9eh6omimd556Yg1WAhFMfSlrLH6zl7tLa3HQudInG9ajJNNa7HcPsTrGCdHhNgsgWEYhonH1DibtK62d1A4znFrDkQuhEjoKBN40mlaseYvhJLV9TieNDWq41Ggx+ucnayKCIVTU0L22Umw4TjjRkwzrsSpplXoYKgECj0rmFOBbmNQndIVb29yCNHz2FWn4avdRjyxqBI2z7TvtsEDMOyUgb4HttmQnLRD9VyBUpz0Uvjk9D3Fttu7z5LoUWqT5Ll+NM37ZREnR+KCIaeyNXYscp0307qwEIpitBaVe4trsd8xSgihk4xr8A9cJpaTBorEdYdhGIZhotIsIYSDm1yfo40IyXbazRkRoiagymT+vR1kQ62etKYnm3SFkNfa2jP5VwSREhHqLEWE6DieJP3fj4Yq0Vg0dfP3WJX8EzINvpOkFa40rEgej1PPuw7odwqQlIaqijr8a9188f+/95+M9NojsGGddxs917h0zYwwkBDSiwjJbn0lNQ2a9X3/U14DeX1DhKlxrUHv9uFFcrTmBuGKp2Apn0zrwkIoitH+2O4tqcFB51FwuAwYZDyIbijCIXTwO5PAESGGYRgmNiNCIWqE5IiQJgIUTlPVnUXVEe8f1Xgok/+COv9Je7pUI0JoayQU4wI5TaprTqqqdqRbu1RUS3VGRDtU4s+dtwEfvw/s+gVwNIj+oZkGoMCVgzmOcZjlPBrLnEPw0NSjgCE+84Cc1CQRqRAmDCS6ND1csnSso1PNbtGizD20tcoKgWqZumanCJOIkwZ1DBIR8t82SIudVufYvrlYursUt50yIOS6isHCyYM74qNl+yN2ipM5vn8enp+zXZVGyLQOLISiGK2g2VtcgxpkYJVrII4xbMNJprX40DHFb71ImsMxDMMwTLSc9AuZGicd37Q1QaFS48hdNVhvn/9dezQWbivCu7/v9asRCma1rC2Gl9PE5IjBmJ45+PRPx6Kgsh7H9csTy3695yRRpE9RJMrm6IpiTDWtxHTzShxt3ApDudPbbBS5fYEhZ+Gihe2x0t4XLhiFQ9z7pw7AMb1z/Z7z21uOF2lsFH2hpp0yw3SsxWkOPrRLFtYdrAgREdJ/LWbefgJ2FlZjbK92quXya+dn262JDrU1b141DluOVIrXNRRL7z8Fh8rr0Kd90+tiRvdsh69vPi7smiKm+WAhFMVoBY5inPCLYzSOMW7DSUa3ENJGhDg1jmEYhonHiFCwjIdQEaGqBrtfIb/MiQM66PamoRqgQ57Gp3pRAWpYKosJrTBSUuNown9s3/aq//XITQOKtgGL/osOm77D7ym+9DXQvnYeAQw5Gxh8JtBxiHAW2PTrLLjgHmvfDuleUaXn4qWgFUIkePQY2T3bK4TaBRJCARu/JmGcRpCFFRGKIiFEIlb7HgWCbLTpUt0gR/JcTRJDTOvDQiiKoR+UuZv9+xzMd47CvfgUxxk3IRlWjggxDMMwMYvNGX6NkGwzrIVqhLTNTWWCRYMockJuXXoTdaoRCiTQUjzWy3LEg1xfVevI9211QMkuoHgbcGQdsHUmUOI2KbB4nN1WugbiV9Ox+Ottd7n79OgKC7cQki24g0Epcr7b/vsoCyGF3ACpceG42wVaX+/1jR4Z1Djk9589D2IPFkJRzNPnjUDP3DQM6pSJe750N4Ajtrl64LArF10NpZhg3Ix6m7qpmI3tsxmGYZgYQRY3oU7kBYsI1docIiKjFxd6Z/Ee7C4OXB9EgkZc6wgESo0LuJ3FpOqJQ2YAtCwHVehnOIz+xsM4raQS+KgMKN4OlO3zjxoYLUDfybANnI4JX6WgGNkiLe2vOiJIKyxk2+pw0UaHZEb2yA457kA1QoFQmSXoCaEYV0LqnkhMrMFCKIqhkOvDZw7F1nxtqN4g0uOuMM8T7nFLGqap/ssNVRmGYZhYwaGKCIWqEXIFTY1zp1mp1ymsrMcTP2z23ifjgPzKetU6SZ70NT0hRKlx1LeGakdkDHCit6kEA6v24zrTaiF8hriOoM//CrE2pcS3IrUP8rUQAlKygbxBQIeBQN+TgAFTxDKT04Xir2aKVVxSSwy9uYHSOLZfB/1eN3qM6JaNDYcqcO1x+gKL6NnO52TXi9L2miEiJDupyWmE0Zga19SIULD3jYlOWAjFAOkaRxolPe4KzMPJxrWY4+leHc6BgmEYhmGi1yyhCREhrxBSozVV6Nk+zU8IUT8+Qs+1K9NiwIdnpuO7n5ejbP9m9DceEqKnr+EIUq1WgDLbFH8EehhPORH18Nnt7IKkLkNw7NHHAh0GAXkDgfQOumEQuZFmsKP461eMwaIdRSItTmtMEIy3/zAOq/aWYdqwzgHXoTqmn++ahMLKhoDNMQOZJQQiKc5T46LJ7IGJHBZCMYC2WRvxu3MYGlwW9DAWIad2D5X4ef/HZgkMwzBMvNtn6wkhvTQlrRDKy0hCZopZuLVpBZYiiBTGGrbh2DmPIrV8B66lBWpDONGgtDy1J1ZU52GnqytqMvvi9kvPxLjX96IW7hS0W/r1w7FHD0YkBAsskEAJJFKC0TEzBaeP6BJyvf4dM8UlEHoNVYOhrqEK3oMo1uHT0LEHC6EYQO5arFCHFCx1DsGJpvUYUbcMP2Jq2AcShmEYhonKhqoh7LODneirs9p16020ttrZqUnISbOohJBSp6QIkEzU4h7zp7jK/LPbvjopA9VZ/TEzPxu7XF2F6KHrDj0G4dj+HfHK/J1iu2GpWfhb99GoRb6fa1wkRHOKVcQ1QpL40bfPRtwQxW8bEwAWQjEAnUGhMyraM2HznaOFEDraugKQhBB3KGYYhmHamkU7ilFQZcPl43sGXU8+tmld46gW5uNl+3HRuO7okp0Ku1RPpKA4xWlT40hMULRBa6vdLs0iGo4eUHLYpKgURYSmGlfgCcu76GwoE8sqB1+CrLP/gf1lBtzzyu+qx+qWZFGbJdDx2mRUNSYN5NAWqwSyzw64vvT66EWT4slrIJoFLKNPFPXzZQJBP+RyepwSZv7FOUpcH+XcKs5ehZM6wDAMwzCtwXXvr8YDX2/wMxkIKoQ0EZ9Plu3Hi3O34+1f9wSsgc3yuJtRCpw8qVbW1UaEKBrUNUftnCYEVuURTNl4N/6b9C8hgnY7O+My64Own/UqkJbr1x+IaJ+eDJMkvpSIhxwF0ktvD0U0H8Wb2z5br/dQrBLN7xujDwuhGCFdSo+jH3Fiv6sTdjm7wGJwYKJxQ1jFpAzDMAzTmhRWuR3OAiFnMWiFUEmNVfUYese3zBSLbo2QkmZH/YVkKBr00BlD8c8LjvK6v11m/Bl47Rjk7J0Fp8GMwlG3ouiK+fjzNX8QVtZERrLvODy4cyaevWAE7j19MEyyPbTF6OeONrSrfvPSWJ1RR2qWoHaN892e/9cT8fxFI3HhmO6IG6L4fWP04dS4GEE+o0Sdj4urrd70uH7GIzjZuAY/OceLZSyEGIZhmGhBjpiENktQR2+UOp4yTzNUveNbVqpZivwY/OqJtKlxdDKxR26auLz51U94xvJ/OMa4DSCt1W0sjGf9Gx07D0fHIE1JKQPqkqN7BjQDUOytiSFdAhsPxCKR1gglqfoI+QRi3w4Z4hJPsA6KPTgiFCOkSUKondTtmYQQMdm0TpzVCtV5m2EYhmFaGjlDO1QNSDD77JoGtxCq8LSJ0Du+ZSZbvGYJqp5EnsfyT41LAuwNwIJ/YGbS/UIE1biSgdOeBa6bC3QerrufcrRJbvwq1yXpmQHoLQtFNB/Fm9RHKML6IoZpafgTGSPIIXklNY5Y6RyEKlcqOhgqMNywVyyzcY0QwzAM0wZ8veYgNh6qVAshHSVEUaBPlu/HzsJqXfGiUO0RQuW1NlGIrlcDK0eEZFFVb3Ngxor9WL3fbXqg0Kl8DfDGCcCCZ5BssGOeYzSmNDwHHHsjYAxPtMjudcHsoXu3129KGstF9xGbJaiEUHwZR8TS+8bow6lxMUK6FJIn60+5h8Fi53Ccbloh0uM2OPrC5vmB3ppfiU6ZKWjnyW9mGIZhmJZi2e4S3Dljnbj97DG+5XpNTn/fVYz7v9qASQM7YHSPHO/yBk3Pn6oGX2pcoGbhWZ4aIUqBk1PnPlt5EG8s3OW9T6ZC95o/Qa9v57kXpHfE86Y/4tXCETimT/uIxipHhEzSRF9xRaNrEkvnN7L+JVqm05nJZu970NgaIXn9SHsQMUxLw0IoBmuE5IiQkh5HQugk0xq87LhAuN9sPlyJ6f/+VbjprH9sWhvsMcMwDJNI7Cyq9t6WS3n0MqmUGpqyGqvKEtsaIDWOaoXqA/QY8pol2ByqM/JfrT7ovT3NuAJPJb+HPFepe8Hoq4CpT+IaexrSVh3ARWN7RDRWeT/1XOO+ufl4/LqjCNdN7IPGEC2BhR9vOwEzNx7Be7/vxZGK+sb1EUqg1LgoeduYCGAhFCOky6lxqWohtMAxUnS7HmXcjTxUwObIwc9bCsT/KqWGcQzDMAzTUsiRH3Xwxj+CoNTtkDlCMPvsaukYVuIxCSLkPj1KapxsuqA4zXVEmegJdJpphXuWmtsPOOtloM8JYp0OAG6e3D/isQZMjfO4opFTXKPc4jy4omRK3bN9Gm48sR8+W3mg0VEds46rXrwSLQKWCZ/4/kQmSESoCO2wwdlb3D7RuE6kBihn0RiGYRimNTAFEELUpFSL4uRGwkc2QAhUI0QUeSy06WnIPVUbEZIh86ArTD/j5+S7hQiyuUxY2/s64KbfvCKoKahS44LUCMUNriaYJahenzivEYoSAcuET5x+Y+OPdKlGSDjeaFDc4yg9jg4qHAliGIZhWhPZFEEWQtpIjSoiZHMGtM92Ol26QshiNKqam6ZYjKo6lH6GQ5iR9CSesryDLEMd1jj740zrU9g85A7AktosY5X32dQCE/1oiyzIYlYWNuFti/gXilH6vjGhie9PZBwhn4HRRoSIBY5R4nqScQOcDqvq4MEwDMMwLY0cKFBFhIIJIbva4ECOCFHNj0xRlbtGhURPRopPCJEwShUNTF24xfQNfkq6T1hiV7tS8KjtGlxgfQzbXD2RJjUmbyztk91jGdurXYtEhNp7zI2O7p2LaEJ+Bw0h+kIFE1HxLoSY2INrhGLwAENdsbWsc/VDiSsT7Q1VGGzbjOr6Y1t3BxmGYZiERq4RskkZbg7d1Di7bmoc1d6Q4QFNtuX6IKLIY7BAfWnkiBDVoFCz04nWxfib5TOx7GfHaDxs+yOOwOcGl9oMQuiWoQ4cTu+P60/oF7RGqLF8cdNx+HT5flx3QuNMFqIx0iELYbmnUDzCAaHYI74/kXF6gJHPhCk4YcQC50hxe7x9lSoixL72DMMwTJsJoaARIadfbyAlKlTd4G6i6pcaJ4SQRRWRybHY8YDlY3H/P/azcb3tbpUIIpolIpQC3DttIDpnp+imBDY1Na5PXjrunz4EHTN9jx8N6NV5hb8tEodEGmucwEIoRpBD75QPrcevGCOuJzhWCavRYAchhmEYhmkpIdTgMASdRCtpb3R8kuuCZCEkH8eIYo9rnEiNk5xUSRhd5vwB3Q3FOOzKxb/t5+k61TWHENJDjgjFa5+cppxPTaQ5CJslxB7x+Y2NQwIVYxoNvi/dCtMo2F1G9MMBpNcd9i4P1ISOYRiGYZoLOevJqooIIaBrnBwdUsivqMeSXSV+ta6qiJCUGZHaUIRL6t0pcf+wXYZ6JKsagnrXs7RMNUAiuMY1JbOkKdEkhmlp4vMbG4dM7J8nrikvWo4IpUknuKyWbKxyDRS3xzSs8C3XOwoxDMMwTAshaxv91DifyNEKnmkvLcJlby3F16sPqZYXeswSqCZITo0btOklpLjqsdrZH985j1NtM6hzZotHhBJBCDUlqNMh0ydM4x3WfLEHmyXECH07ZGD+X09E+/RkpEgRoTQzUO05hpBA+qV2FMYbt+I450q8hZPFctmRh2EYhmFaAvlQI0eE9KIJ6oiQvsvpV2vUQqig0h0RykqxINMTERpu2I0ue74St5+wXe2XEje4SyZW7itrRSEUn31ymhLVOfOorlizvxzH9IkuJ7yWgHVQ7BGfpy7iWAxlp1lEYWaSJweBhJD8A/yL022jPcGwCclw51OzEGIYhmFaGtkdrkGOCOnVCElCqEZeWQetgKEWEulimQuPWD6AAS6szp6Kta7+ftv2zE1rVtc4PcxGY7O5xsXjBJ+E4mNnD8P0EV0Q77A5VewRn9/YBCAr1a2AspLU/vzbXD1wyNUeKQYbJhg3ieWyNSnDMAzDtASyTbK6Rii4EArV9657O3UT1JxUCzJSLJhuXCb6BTlMKVjU6xbdbd39hdyQxXZL10bFa2ocz+/Dg1+m2CM+v7EJwDPnH4UHpw9CJ+n4kCJ+8A34xdNc9WTjWnHNNUIMwzBMS4mfjYcqROaBnD5lDeEaVyc1S60NKYR8UR0iJy0JWWaH1y67YMSNcGZ21d1WTlWTU9iaE5McEYrT1DiOdDDxCguhGGXK0E74w4ResBj9OzYr6XEnCSHk0k2N21lYjUe+3SjceRiGYRimMby+cBfOfGUx7vlivSryE8o1Tq4LqtG4xmnplqOJCKVZMGjPe1677JJRN6rc4WTyMv0bkDc3qoaq8RoRausdiBF6t09v611gIiQ+v7EJhJyO7I4IAb87h6HBZUEPYxH6Gw7BZvf/CXt/yV68v2Qfvlx9sDV3l2EYhokjXp2/U1x/veaQKvIjl/3IKXPK/Xq542oIumqEUBdjObpvfN1rl21MSlPZaXfMTMbUoZ0w40/HYvLAjrhkXA88fvYwtEb/pHgVQmyBHZzvb50oPnP/d824tt4VJkLYNS6OhBA1maPf4zpXCpY4h2KyaR1ONq6B1XGx33bVnkZ1NSFSEhiGYRgmnAlyINc4rVmCnBYXDiRyyCVOabB67N7/wGSv9dpl30p9haSIEJ2V/+/VvgnpsxcehdZqohm/qXFtvQfRzYju2arPHBM7xOepiwQVQpT/bPHkKs/3pset002NUzp3K9cMwzAM0yQh5ArPLEHbQDUUaRaTSIdT7LJ77v9GZZdNxz5ZCFnMLVMLFAh5fPHqGscRISZeic9vbAKRZFSH56nRnFwnNM64Da66Sr/tGuwO1TXDMAzDRIqscVSucXJqnMsl/newrNavh1A4kH12u7QklV22fdhFXrtsckaVU+NkO+vWwC6NW2ltEW+wDmLilfj8xiZyRMjzI3zA1Qk7nV1hMTiQeWhR4IhQBHnaDMMw0cxrr72G3r17IyUlBePHj8fy5cuDrv/SSy9h0KBBSE1NRY8ePXDnnXeivp4NZBqfGidHhCTXOKcLf/18HSY++wu+XXsItTb9lOxApm7U/yc71WeX7TSnwDT1MVVqmioi1MpiRDZLoD5/8UjHrOS23gWGaRFYCMWTEDKQEPL9CM93jhbX7Q794redIoCOVNTjvi/XY+2B8tbYXYZhmBZhxowZuOuuu/Doo49i9erVGDlyJKZNm4bCwkLd9T/++GPcd999Yv0tW7bg7bffFo/xwAMPtPq+x0ukIJBZArWyIzMFxVwhUGqcYvijhfr/5KW4vHbZ1vG3wZDdHTee2A/njOqKQZ0yNUKodcXIiG7ZOHtkV9w8uR/ilTeuHItjeufi4xvGt/WuMEyzwmYJMY5sn01nouSUAEqP+xN+RF7+IjolRyt4/6ekxC3eWSyuP11xAHv/cUar7jvDMExz8eKLL+KGG27AtddeK+6/8cYb+PHHH/HOO+8IwaPl999/x/HHH4/LL79c3KdI0mWXXYZly5a1+r7HC4Hss+WUOVeQ1Dhqfqonkig17ozqL7122Z0n3SGW33f6YO86shCSXdxaA4PBgH9f5j7xGK8M7JSJz26c0Na7wTDRIYQo/eC5555Dfn6+OOv2yiuv4JhjjtFd99133/UemBSSk5M5/aAFIkIUnpeLRFc6B6HKlYrMhhLgyBqg21jv/9gkgWGYeMFqtWLVqlW4//77vcuMRiNOPfVULFmyRHeb4447Dh9++KFIn6Pj1+7duzFz5kxcddVVuus3NDSIi0Jlpbv20maziUukKNs0ZttoxSbVnMp6xmq3q0RRVa3vdZQJZD2dUpePSQUfiNuvGq7E48YkODSvW5J0UrDOam+R1zUe37N4H1u8jiuex2YLc1zNNW5zY9MP6Gwb5WBTjjWlH2zbtg0dO3bU3SYrK0v8Xz57wjS/EDJKrnGEDWb86hyB6ablwPY5LIQYholLiouL4XA40KlTJ9Vyur9161bdbSgSRNtNnDgRLpcLdrsdN954Y8DUuGeeeQaPP/643/I5c+YgLS2t0fs+d+5cxBqUAVfvAFLN6mnEFvFam/wiQvLy6upq/L5ilfe+jMNaJ1zg/J7vh78iyVkn7LLnGo/B+JkzA+yZe18O5RcIUdtSxOJ7luhji9dxxfPY5oYYV22t23yl1YVQpOkHivDp3Llz0/eWCVkjpLjGyelxQght+xE4yXe2tCHCPg4MwzDxxIIFC/D000/jP//5jzipt3PnTtx+++148skn8fDDD/utT9EmOgkoR4TIYGHq1KniZF+k0NlMOtBPmTIFFovbGjpWuOerjfh6zWF8/qdjgCU+Q4r+AwYCB3b5mSX0HzAI2O9uvJqWno5BQ3sDOzb7PW77nCwU1FWplpFddv/yxeL2k7ar0KVbDqZPP1Z3v25fMkdcZ+bkYvp0/SyVphDL71miji1exxXPY7OFOS4lKt+qQqgx6QfKGaBevXrB6XRizJgx4uAzbFjgLs+cghAeNB51ywKXyr2GmOsYC0eSBab8DbDtXwF0cdtq1+vYZkfT6xPP75l8HU/E69jidVzhji0Wxp2XlweTyYSCggLVcrof6CQciR1Kg7v++uvF/REjRqCmpgZ/+tOf8OCDD4pjmzalmy5a6EDdlElIU7dvC0gEEf9dvE/9D0MA/yVNFohspKA1RVDjs8uuG3wB6vLH4IqxPUK+XjaHq0Vf01h8zxJ9bPE6rngemyXEuJprzOaWTj8ga1KKFh111FGoqKjA888/L3KzN23ahO7du+tuwykI4SMLob179qKmhg447oOOES6UIxNrk8dhbP0SHPz2Kazv6Y7k1dRRWoL64NSSqQSNJR7fs3geVzyPLV7HFWpszZV+0JIkJSVh7NixmDdvHs4991yxjE680f1bb7014Li0YofEFEGpckxotK9ToKabfmYJATISyCZbRrHLhjkVqac/gVnZ+nMGLfXcFoJhmGhxjZswYYK4KJAIGjJkCN58802RgqAHpyCEP66Zs30TmK49eqC2sAb7qt1W2JmpFlTU2bGv/9UYu3EJupUtwwO4GW/+cRIcy+Z7Dkk+pk+fjmghnt+zeBxXPI8tXscV7tiaK/2gpaFjxjXXXINx48YJ8wOqX6UIj5LGffXVV6Nbt27iRBtx1llniVTv0aNHe1PjKEpEyxVBxITfTFXrGqdaLgkkullr1e8jlGz2ve7JsHrtsnH87UCYIojgRuEMw7SIEGpM+oEWOtjSgYcOOoHgFITwkUziYHeSa5zvDGdmilsI7c8eC7Tvj6SSneiVPxtztg5VdcJWiMbXJh7fs3geVzyPLV7HFWpssTLmSy65BEVFRXjkkUeEo+moUaMwa9YsbwbD/v37VRGghx56SNSv0vWhQ4fQoUMHIYKeeuqpNhxFbEeEZMGjWi5babtcXotsssWW7bLliNB1pp+EXXYB2qMTCaEIYDMghmFapKGqnH6goKQfyFGfYFBq3YYNG9ClS5dInppB6NRru9Op6qhNQoiwOV2wjbpa3L7MND9g926GYZhYhtLg9u3bJ2pMqR8QRXpkcwRq56BgNptFM1U6KVdXVyeEErWGyMnJaaO9jz2059PkFLhAgoluKn2E2qUlqdZL8ZzI64Ay3GL+Rtx+M+kqICmylPjW7iPEMEyCCCEl/eCtt97Ce++9J7px33TTTX7pB7KZwhNPPCFqe6hHA3X7vvLKK8WBSilQZZoPm0MthLJS3AE/u8OFI73PQ4PLjJHG3cit3NKGe8kwDMPEA64gkR/1cvWaShQoJ00dbVQiQn8zf4Z0QwPWOPvjF/OksPeHmpp2yEyO++amDMO0YY1QpOkHZWVlwm6b1m3Xrp2IKFFH76FDhzbjMBjCale7xikRIavDiYPWNKx1Ho2zTUvQddcMAOe14Z4yDMMwiWKWoK4RcgUWQhaTsMu+0LRI3H/CdhVgDL9e6+yRXXHWUV24VyHDMC1rlkDpB4GceCj9QOZf//qXuDCtExHK8ESBiEzPbVp+pLweXzhOFkKo9+GZSMPpqEVKG+4twzAME8todU84rnF0s87mNkvIkVLjSLskmQx42PIhjAYXvnYcjzWuAegboaZhEcQwTIumxjFRnhqnigh5hJDdhSMVdVjiHIo9zk5IctTgTFPgvk8MwzAMEwqXJjkuLNc4+CJC7aSIEGUzDC77BeONW1HnSsI/bZeK5VzvwzBMS8JCKM6EkIwcETpcUS/6Bn3iOFksu9zkM7xgGIZhmEih+tOwUuOkQ1Mgs4Q0ox0n7HlZ3H7TcSaOoL24zeY+DMO0JCyE4gjqpi3bYss1QkfK68TtLx2TYDeYMcq4G8MMe9tsXxmGYZjYRmtTHSgipG2oqkSERvXIQft0txh6uP0vyGo4giOuXLxpP9O7PkeEGIZpSVgIxREU+ZHPyKUnS65xIiIElCAba9NPELcvNc0P+Dja6BLDMAzDBBdCiMgsoUt2KpbcfwrW3jkCF9R+JpY9a7sUdVL9Ktf8MAzTkrAQiiMozUBOVaDCU69ZgkcIEXPTThfX55p+QyrqVQcou8OJ4/8xH6e8sDBgTwiGYRiGabD7mqEq2QchI0IiNc7ubaiaZDYiZ8mzMFirUZQ9At86j1NtyzKIYZiWhIVQHPDWVaNxbN9cPHP+CFVqnNJTqN7uQEWdzbt8FYYJ04RMQx3ONC1VpdYdKq9DYVUD9pfWiu0YhmEYRo8Gm1r4WAMcM+RMBbpda3N4hRAOrwHWfiTurxl6L1yaaYnUjYNhGKbZ4Z+YOGDywA749E8T0CM3TVcIlVRbVetXNTjxqdc0wZceZ3c6YZVSHeTHYhiGYRg5ulPvETSBUuUUZE8FWkfRRakWIzDrAXfl0IiLUNF+lN+2XCPEMExLwkIojg9SihAqqmpQrVPdYMcXjkmwukwYbdyJIYZ93oiQfCCzBTioMQzDMImJfIJMK3zkE2ky8rFEqQ8i0nb9COz/HTCnAqc+BrMnnVvmvtMGN9OeMwzD+MNCKM6gqI5Cktl9UCmpsfoJITJNmOMcJ+5f5okKUS2RfIaPI0IMwzBMoGOMtkYoUERIr3Yow2yHae4j7jvH3w5kd4dZyoObMrQTNjw2Fcf1z2u+nWcYhtHAQijOkO1L5YOKVggRHztOEdfnmhYL0wQyWqiRztaxcxzDMAwjI58goyyCcCJCWsFE/MEyD6jYD2R2BY6/TSyzSBEhuq20gGAYhmkpWAjFGXo1QoHE0hLnUOx1dkKWxzSBhE+tRySJx9Ic5BiGYZjEJthxIZAQ8l/uwoX42X3zxL8BSel+J+8CnchjGIZpTviXJs6Qs9mU1LhAkDvPp46TvOlxJKI4IsQwDMMEglosBEIv8qMnhMYYdqC36xBgSQOGX+hdLtcI6dULMQzDNDcshOKMp84djsxkMx46Y0jAiJDMF44TYXOZMMa4E4bCjaiRIkLatAeGYRgmsQlWOxo4NU69/CLTQveNoecAKVne5fIxy8IRIYZhWgH+pYkzhnfLxtpHp+L6E/qGJYSKhWnCWHE7c9PHqPE0utMWxTIMwzBMsNS4gGYJ0nKqR/X2rxt9pWo9s5EjQgzDtC4shOIQk+dgohVCuelJuut/4jFNyNnxFay1Nd7lnBrHMAzDyAQ7QaaNCLVLs/gJpNONy0Uz7wJzV6DX8ar1zXJEKIwTeQzDME2Ff2nimGSz+u3Ny9AXQr85h2GfsyNM1kr0LpjtXc6pcQzDMEy4qXHaiNDoHjl+J9UuNrvT4pZlnwZomqXKrnFydIhhGKalYCEUx3TJTkEKde72kJeRHMQ04WRxe3Tht97l7BrHMAzDhO0ap8kiGNMzR7W8p6EAxxq3wOkyYF3u6X7bq1zjOCLEMEwrwL80cQwdSIZ3zfbeb68RQqkWk/f2F45JcBrM6FW3EYMM+8UyTo1jGIZhZCKpHe2bl65KmbvQY5Lwq3MEbBld/dbX9hFiGIZpaVgIxTkjPakJeqlxfz93OP537dHo3zEDRchBcTd3rdClpl/ENQshJtpwuVxYvKMYRVUNbb0rDJOQBEuNU3jkjMF4cqwdJo+YoZQ5I5y40LRI3P/MMRkZyWa/7eQoEPcRYhimNeBfmoQSQuqIUFaqBScN6oisFPcBaX+fi8X1+aZfkYKGsA54DNOarN5fjivfXoYHvt7Q1rvCMAlJOCnTvdqnISsJUII61MR7onEDuhpKUebKwFznWGR4jjsy7BrHMExrw0IozhneNStgREhJjVPOwhXkTUC+sROyDbWYblzGESEm6lAiQcXVHBFimGhrqKpg9JggGCVhc7EnLe5bx3GwwqIbEVL1EWIhxDBMK8BCKM7pk5eOC8Z0x/mju/lFhFKTjKoDjt0F/GCeIm5fZp7PrnFMVKbGERysZJi2IZxMAUXPmDyCKBvVmGJcKW5/7pgsrvVT42TXOJ6eMAzT8vAvTZxjMBjwwsUj8eIlo/z6MqQoESHPAYeEz5euybC5TDjauB1p5dvbZJ8ZJhDKHEwRRAzDRJ9ZghIRUnranWP6DckGOzY5e2GTq7dYphsRksQPR4QYhmkNWAglEFohpKTGKcspFe6ANQs/O8eI+332f94Ge8kwgXHBLYBYBzFM9NYIKQJIEURKWhyZJCjo1gjJESG2z2YYphXgX5oEQnuGTYkIKctJCNVY7fjE01Oo76HvAVtdG+wpwwSPCDlZCTFM9KbGSRGhoYa9GG7ciwaXWdQHKYROjeOIEMMwLQ8LoQQiUERIOfNWVW8XZ9qpx8NBVx6S7VXAZl+DVYZpa7hGiGGiTwgpESAFxSSB9NBFnmgQOcWVI9O7TujUOJ6eMAzT8vAvTSILoSR1RKiiziauXTDiE7s7KoRV77b2bjJMQJRAENcIMUz0uMa1T0/SjQiZnVaca/pNZZIQLDWOBJSiqdg+m2GY1oCFUAKnxiWbjaqzcBW1biFEfO44EU6YgP1LgMKtrbynDKOPkhLHqXEMEz01QlpHUiWw0+7gfLQzVOOIK1dkGshkJlt0H1/JUGDXOIZhWgP+pUnQiFCKxSgc5eQzbyU1vt4shWiHXe0muu+sfq+1d5VhQrjGtfWeMExiopcal5epEUKeY0v7HW7DnS8dJ8CpmW7QMUgPiyckxK5xDMO0BiyEEgg51UCpD5IFUlG1VbX+6o7num+s/ZhNE5goqxFiJcQw0WKfnaeTGpdiLUXm4V+9GQZalBNxASNCXCPEMEwrwL80CUSSdGBRCyH3Aam4yhcRInZkHA1k9wTqy4HN37XinjJMqBqhtt4ThklM9FLjkjXRHar16VG6GAaXE8ucg7HP1Tnsx1eOR0pkiGEYpiVhIZRAyGfYkjz1QfLy4mq1ELI6DcCYq/1MExrsDrz2y05sOlzR8jvNMBJcI8Qw0RcR0rrGmQwu9CxZJG5/ZlebJIRCqQ3iiBDDMK0B/9IkEHLOtXyQUc68NdjVBzgbnfkbfQVgINOE34GibWL53Z+vx3Ozt+EvH69ptX1nGFWNUFvvCMMkKHo1Qlpjg7T8FciwFsJpScdM5zERPX5OmttEoZ3nmmEYpiVhIZSgZglys7pA/RqETWpWV2Dgae4Fq94TTVe/X3dY3N1dXONdd39JLbYXVLXczjOMEEAcEWKYaEuN0zY/zdr2mbiu6X8W6pAS0eM/f9FI/OuSkRjQyddziGEYpqVgIZRAyIJHTmXQpiDkegpfvWf+xv7Bfb3uY/yy8YB3vWFds7y3Jz33C6b+axHKatSGCwzTnCgfSZ3sHIZh2qiPkHwMSUcd0nf+IG7XDLkk4scf3i0b543u3sS9ZBiGCQ8WQgmESvyoIkIG3eZ4VuWA1/8UILsHUFcG8zb3AY4g05+CynpV/6FD5ewux7S8axw3VGWY6EiNI+Md+XhyhmkpjPY6VCV3ga3ruDbYQ4ZhmPBhIZSgyGfwtGkNHTw9Ibxn/owmr2nCoENfetc7VFaH8U/Pw8gn5vj1j2CYFnWNa+sdYZgERSuE0pNNqtYMF5sWiuv97U+AiZuiMgwT5fCvVIIiR4cskoOc3CVclQs++krAYES3ilXoZzgkFpVJkSCGaQ3YNY5hoqtG6MSBHb1p130NhzHOuB0ugwkHcicKG209JvbPa5V9ZRiGCQULoQRFlRpn1BdC3tQ4QjJNuNT0S8DHVW3DMC1VI8Q6iGHa1D777JFdcffUgXjs7KHeE2sXeaJBtj4no8GSIxqrypw+vDP+OmUgXr50VBvsOcMwjD8shBIUtVmC+mCVl5mk7w7kMU24wLQIydA3RWiwOZp/ZxnGA9cIMUx0pMb165CBW08egMwUizixZoIDF5h+Ff9rGH6ZuNYakvbITcNfThmA9p6TbQzDMG0NC6EExRzENc6bGuc58/frjiLc/NEqFHc+ARWWjsg1VGOacaXu43JEiGlJFP3DESGGaRuU2lH5BBodT040rkNHQzlKXJlw9j9Vt2ZU23iVYRimrWEhlKDI4qdLtrrPQ06qxddQFcBVby/HzA35+OecHVjZ/kyx7DLTfN3HbbC5D5JWTXNWhmkOlNogjggxTMvQYHfgx/VHUF6rjvpvOFiBVfvKvJkC2gbdSlrc146JMJmTdYWP0rybYRgmWmAhlKDIEaFxvdqpa4Y85gnUPFWmqKoBy7LPgMNlwATTZvQxHNGNCL3083aMeGw2Nh2uaNExMIkH1wgxTMvyyryduOXj1fjT+6u8y5xOF856dTEueP13FHt6xcmOcBn2MpxqXC1uf+aY7DVJ8I8I8ZSDYZjogn+VEhT5TJ3BYMCjZw0Vt3u1T0OSJ1qkrRFKTzaj2JiH+c7R4v6lOlEhOpv40s870GB34sGvN7bwKJhEw+UxzmbXOIZpGb5YdVBcL99b6l1Wb/fVfh7x9IqTI0IDCmbCYnBgrbMvtrt6eE0StBEhbT0qwzBMW8NCKEHR9g668theeO3yMfjvVeO8/7N5aoQUMpLNIuLzieNkcf9C0yKkoV43NY4oqWlAa1BS3YC/frYOK6QDNxPnfYRYBzFMi5Bi8Z8W1FkdfqLIK3JcLvTa/7W4+YXjRHHtiwipH4drhBiGiTZYCCUox2v6OFBU6IyjumBQ50xv/RClxskHQIoI0bKFzpE46MpDe0MVXre8BAvsumYJpdX6znLNzdzNBfhy9UG8/eueVnk+pu2gFB2Ca4QYpmVIsZj8ltVLNZ8Vnv5x3rYLh9cgo2I76l0WfOc4zi/bQM6O056AYxiGaWtYCCUYv95zkujhcMGY7gHXkVPjyqSC2SSzUSxzwIRbrbeh1pWME03r8azlvzDA6RcRqpFEVEtS57HsVq6Z+EWRP1wjxDAtQ7IkhOZtKcC3aw9hX3GNd1llvfvEl1fwrPlQXM1yHo1KpPv1DpLvsxBiGCbaMLf1DjCtC/VxoEswlDxuco0r9RTGKk5wSsRnras/brbdjv+zPI/zTYtR6MrBP+yXt4l9tmLqoNh9M/GLUhvENUIM0zLIjp/Xveduk6DRNr7jhK0O2PCF1yRBb12RJuc5c2HSNhZiGIZpYxr1q/Taa6+hd+/eSElJwfjx47F8+fKwtvv0009FqPzcc89tzNMyrYRSBEvCQo4IkeCQneQWOEfhXtufxO0bzT/gOtNM0VBVPuun9JxoSRSbb5udJ8fxjhIJYh3EMC1DhcY2O9D3zUKiZssPQEMFnFk9sMTpNtzRrsoRIYZh4koIzZgxA3fddRceffRRrF69GiNHjsS0adNQWFgYdLu9e/fi7rvvxgknnNCU/WVaAXGAE8KChJA7H1w5U6iIDoUvnZPwD9ul4vbDlg/RL/8nZKb4Ao0FVQ2tdgaTm7nGP0ptkOIexzBM81Je5/vND4ZIjVvrTotzjbocLs90QttDTq4ZYiHEMEzMC6EXX3wRN9xwA6699loMHToUb7zxBtLS0vDOO+8E3MbhcOCKK67A448/jr59+zZ1n5kWxmuW4HShTJMap+0tRLzhOAvv2E8Tt8/c8ySOdqzzs1ptSTg1LnFQzkxzjRDDND/U/qA2zNrOzLpDwG53E1XT6CsCridrH7bPZhgmpmuErFYrVq1ahfvvv9+7zGg04tRTT8WSJUsCbvfEE0+gY8eOuO666/Drr7+GfJ6GhgZxUaisrBTXNptNXCJF2aYx20YzLTYup8Ob1lZc5RMy9TY7rLqGBAY8ab8SHQzlOMu0FC/ieVxqeAgbXX2xv6QaI7tltujYGmzu4l2rzRn173G8fhZba2x2h8NbI9Rar2Giv2exNG5K237uueeQn58vshVeeeUVHHPMMbrrTp48GQsXuifyMtOnT8ePP/6IRERxhAuHrvu+cSfC9TkRaNcLgH7fODkixA1VGYaJaSFUXFwsojudOnVSLaf7W7du1d1m8eLFePvtt7F27dqwn+eZZ54R0SMtc+bMEdGnxjJ37lzEI809rmpxLDSLs+6rN+/0Bg4PHDqCsno6qPmf1aO0iL/abkKvpCoc5diE/yX9ExdYH8ei5Q6YDq6J6PkpwLOu1IB+WeGNbcce2j8jyiurMHPmTMQC8fpZbOmx7djnfq8pMvTjjzN1i7hbikR9z2praxELKGnblKVAtasvvfSSSNvetm2bOBGn5auvvhIn9xRKSkqEeLrooouQqOilxUleB17IJbTz7i/dd0ZfFfQxOTWOYZiEdY2rqqrCVVddhbfeegt5eeq+NcGgiBMd0OSIUI8ePTB16lRkZWVFvB90RpMO9FOmTIHFYkG80FLjqqq348GV88Xt1HadgIIicbtdXgdUlNQCdfrpblZY8N9uT+GmvbdjmHEf3rf8A3N7vYvpU46O6Pn/b/FevLdsOzItLiy7/+SQY1vy3WYg/yCSUlIxffokRDPx+llsrbFtnL0d8w7vFbdPP/10b+PGliTR3zMlIh/tyGnbBAkiiuxQ2vZ9993nt35ubq6fmQ+daEtoIeSJCGUmmzG+by4uObon7pyxFtUNvl5xxLHGLUipOQQkZwNDzhTL6KREKBOTXu0bfyKTYRimzYUQiRmTyYSCggLVcrrfuXNnv/V37dolTBLOOuss7zKnp47DbDaLM3X9+vXz2y45OVlctNCBuikTkaZuH60097jSpNKxohrfGULKiqM+QsEosafiD9Z78WXSo+htLMDZm+6E5ZSfgeTw0+MWbC8W11U2Q1hjU8qWqEY3Vt7feP0stvTYDFJqjdliadVO9Yn6nsXCmBubti1DmQuXXnop0tPTEzZlu7jSfZKrb4d0vH75KHE71WJEtcbz5mLTAnHtGHYenDSNsNmQajF564vksRVLjbX75qZE1Xjj4T1rLuJ1bPE6rngemy3McTXXuCMSQklJSRg7dizmzZvntcAmYUP3b731Vr/1Bw8ejA0bNqiWPfTQQyJS9PLLL4soDxN9yOkLxZLrG7myWUMIoaoGG4qQg6tt9+GLpMfRqWYrMONK4PLPAXNSRK51kZol6Bk5MPGFU8rRoTohk06aJpN4NCZtW4ZaQGzcuFGIoURO2V5aSN8nE2zVZd40Y5eNGqz6vmdZqMHpRnfLjMXVvVHuWc/o8q2njMl97Z5mWIwuzJk9C/FANL1nzU28ji1exxXPY5sbYlzNlbYdcWocpaxdc801GDdunChCpTzsmpoabzrC1VdfjW7duomDBvUZGj58uGr7nJwcca1dzkQPdJZdSXOorNfaZwcXG5V17hSKva4u+KP1b/gi9Wkk7V4AfHszcN5/6TRtWM8fCYqlN9tnxz+yDOemqkxzQQJoxIgRAY0VEiVl+/DivcCu7RjQqxumTx8hlr2++3cUF1R71znLtAQpBhtcHYbguAtv8XZQfX7rr6guc0eUaEzK2LDkF7FsZI92mD498OsbC0Tje9ZcxOvY4nVc8Tw2W5jjaq607YiF0CWXXIKioiI88sgjwpln1KhRmDVrlvdM3P79+0VKAhO7UNNbisqQ8JFzw2UhlGIxot7mLzyqJOG03tUPn/Z5ClfvuQfY8DmQ0QmY9lTI54+0oNYaRxEh6pPz30W7MaRLFiYN7NDWuxN1yOKHdRDT2LRtGTqRR/VB5G4ajERI2a5qcKe2tUtP9u5TWrJ6mnCRye20Zxh9JSxJvih/urSesq08rgn98qJmnE0lmt6z5iZexxav44rnsVlCjKu5xtwoxUJpcPv27RP50suWLRMOPQoLFizAu+++G3Bb+t8335DtJhPNpCWZ/CabJDgUsZGeZA5otCCzJf0Y4Jz/uO8seRX47d9NigiR0NpV5Ds7qeojFCJtLxZYtKMYz/y0FVe/4049YdTIn0cWQoxe2raCkrY9YcKEoNt+/vnn4lh25ZVXItGp8Zz4ypBETZr0Wz/QcACjjLvggAk46hLVtikW9zFDy4PTh2Bi/zzceKJ/PTDDMExbw6EbRpd0HaHjjgi5Z5+pHqGkxa7xWRUiZeQlwJQn3QvmPgysm9HoGqHJzy3AKS8sxKbDFern8Dy3XEMSixzypJYwoSNCnBrHyFDaGjmUvvfee9iyZQtuuukmv7Rt2UxBToujmtf27dsj0VGi/BTxV5B/65Vo0M52E4GMDronz7TcMKkvPrx+vCpixDAMEy3wLxOjS3qy/0GtxmoPedDTE0+C4/4CVOUDS19z1wultwf6nxpxRKikxu1ANG9LIYZ1zRa3FXEmbjudSDaGt2/RSGv2xYlFZO3DQohpato2OZdSrzsyPGCAervDL7qj/NabYcd5psXi9q7u52GQZttwjwkMwzDRBAshRhc5HUKbNkGkBkiN0+Kt26EZ/tS/AzWF7nqhGVcDf/ge6DbWbxuzyacGAkV47FI9kFwbROlxsXzikXVQJBGhNt0VJgqhtG09B1MlbVvLoEGDRF0e46aeeiRQPZSOEDrZuAZ5hkoUunJQ1sW/X1u4xwSGYZhoglPjmLAjQnLkJS1APrj/NpKBAZ2NpXqhvpMBWw3w0cVAya6gZgnKGcpgKXjyc8S6YQJHhIKjEj88f2WYlkmNM0upcRazKi3uK8cJaJfpbxfeLi3+irUZhol/WAgxYUeEZALVCGnx6ztEvYQu+RDoMhKoLQY+OA+oKgiYGlen40znJ4TsvtuxbqFt4JhQCLhGiGFaOiIk/75TRKgDynCSca24v7nTWThlSEe/bW8/ZQAGd87EQ2cMacU9ZhiGaRoshBhdZNegZOnsIJFkMsIipa8Fw6bUCMkkZwJXfAG06wOU7wM+ugCo9/nBOySRoxyYtcgOceqIUIxPjqWXVX4dGDdO6ePEQohhmpd6z+91itknhEgUnW9aDLPBifK8Mfj3Xy5BsvR/hfYZyZh1xyRcf0LfVt1nhmGYpsBCiNFFLnzN0aQ8kAgyB3F2kwkYocnoCFz1FZDeAcjfAMy4ErA3+IkZvV5FhF2aEcvPIdcOxSJGKTcu1tP8WgKuEWKYlqPeqmOWYDHiYpO7vqq4/4Vttm8MwzAtAQshRhfZ6jQn1dc0jyARZNE4u8kRJCVqFHIyn9sXuOJzICkD2LMQ+PpGccpf3iZQRChQXVCsiwdDECtyRi1+uMidSVQijRaHu77PNc43NehZsw79jEdQ40pGdf+zItxThmGY6IaFEBMyIpSZYlYV8VOfHzki9PxFI/HjbRNV22ekmNX22YHoOhq45APAaAE2fQXMfgA2ySChLqzUOKlGSKoXikXk1znWo1stgUuqEYrtd5phGsea/WUY/uhsvLN4T1jrr9xbihGPzcYHS/eFXFc58SRHhAYe/Fpcf++YgKS0nEbvN8MwTDTCQojRJV0yS0hLNnsjPESSyaBqejqoUyZ6tU9Xub0pESI5QrP2QDlKPX2AZD4vG4AX0u9w31n2Om4+8iBGG3YEF0IqswQpNU4uIolB5CBHzNc7tQDcR4hJdP72xXrxu/jED5vDWn/p7hLUWh1Yvqc08oaqdeXoeni2uDnDcZIqUsQwDBMP8K8aEzI1jqyykyTDBItZbZZgMbtvy+soQkip39mWX4VzX/sNxz4zT/fA/krRaHzd6TaRHDaybhm+Tn4UH1qeQtqhJerZr44QssZRapycwhLrY2kJuEaISXRMEXrsl9fagvZkCxoR2vA5TI56bHX2wBpXf1WkiGEYJh5gIcSE7CNEaXKyc5xIjZM6tCvRIXkdb0TIk6q26XCFN1WOzkzWeYpyZX5IPRu4dSUWpE6FzWXCRNMmHLv4WuCdacD2OSpBFKihaqynxskCT07/Y3QiQqyEmATEqKnPDEV5nS2saDl9nxoU1zgSPPRlW/WeuP+p4yRxkoqFEMMw8QYLISZkHyGyT5VT40j4KFEgcd8jiuQoklIjpIgU+QB68ZtLcNari/2eU0xr8/rjtew7MbnhRbxvnwKHMQk4sAz4+CLgzUk4zbgcBji9goEiKPJ8ONajKA5psmKL8TS/loDT4ZhEJ0zDTi/ltdawDBMUEeT9vT68GijYAKcpCV873DWgqSyEGIaJM1gIMbqkaxrqyWlvokZIjgh5RFHX7NSAqXFa04SdhdV+jnCKCxg1YT2EDnjEfi1mHPc9MOFWwJIO5K/HG0kvYU7SvTi6Yg7gsPsJn7aoEappsIvxNAeq2qcYF3UtAdcIMYmObLEfSWpcKCEk/x6n0O+9JxpU0Xs6KpCh21OOYRgm1uFfNSZ0jVCSWSWEyDHOLNcIeU5RdmuX6rd9Vb0df/t8HVbvL/N7jgpPyoaCcpyW095KDbnAtKeAOzfCNelvqHSlYYDxEP5U8izw6li4Vv0PSbC1aWrc1H8twqkvLsSqfaGLkUMhT1Y4NS64axxnxjGJSMRCyJsaF0IIedw6yfTGbK8FNn4p7mccdz16tU/D0b3bRZyWxzAME+2om78wTIAaIZVZgsY1TrndNSdFZbmt8Pmqg97b04Z1wrI9peIsJQmh3HRfjyLlMK3bRygtF44TH8DxcwbhKtNc3Jg8C1lle5E6669YmJyL/9rPwCeOk9skinKovE5cz9qYj7G9cpv0WLJTHEeE/JEDfhwRYhIRU6Q1QmGmxvkc40zuVgbWaiC3Hyx9J2LeXa6IBRjDMEwswBEhJmSNUJpejZAUEVL+1zXHPzVOS5LZhOxUi7hNQojSyrSpcXIkpF5KqaPjeBXS8B/HObgp711g2jNwpHdGF0MpHrV8gMXJt6PP1jeB+kq0Bc0xL1fVCHFEyA9Z/HBDVSYRicQ1jr4jkabGCSHkSYvDmKtFczPKAuBoEMMw8QgLIUaXdJVZgjo1LknjGqekyXULRwiZjD4hVGsTqXMK1OtCa4ct563Lk2Dqco4JN+PwNUtxv+067Hd2QJ6hEsO3vAS8NByY/xRQ2/RUtUhojlQttWscR4SCvcasg5hERPrpDUmN1aEylgmG8ls71HQAOLQSMJqBUZc3bWcZhmGiHBZCjC5pfqlxJo1rnCSEjOELoWSLUR0RsvqEUFW9J5ddioTIDVVV9TOeyInVYMEnjlNwkvVF3Gm9CRXpfYD6CmDRP4F/DQfmPARUFaC161eapY8QF8HowDVCTGITSWpcmdTA2h5matx5rp/dCwZNBzI6NnY3GYZhYgIWQowuJHaUKJCffTY1VPUcjGm5wZOqIafGBRIFtH5WgNS4ak90SFUjZPXddqj6CLlU6zpgwtfOE/D1hC+Ai94DOo0AbDXA768AL40AfvwrUL4fLUlzRChUrnEapz1GLX4SuUZo7uYCfLB0X1vvBtMGRFKrIxvShPq+UEQoGVZMsf3iXjD2msbvJMMwTIzAQogJaaGdnmRWN1QlVyGPMJJrhWSnueJqq+p/CvQ4SkSosl6dGlelJ4Q8TkbaBpqKYFAatirYnEZg2LnAjb8Cl38GdD8GcDQAK/4P+Pdo4OubgKJtiFb0ol7h8uLc7eISz8iTuUQWQje8vxIPf7MRW/Pbph6OiY2IkFIfFI4LJQmh043LkeGqAbJ7An1PbtJ+MgzDxAIshJiA9MxNozpZ4Qando3zmSXIKXIyQ7tkqaJICvQ4arMEn9CpttqF2JGjIgFT45T+RJo6Gu992vGB04Dr5gDXfA/0nQw47cC6j4HXxgMzrgIOr0Fz0hzF+7IIjMQsgdIK/z1vh7iUSukwsczvO4vFZL9WSp+UX+IE1kFeCisb2noXmCg2SyjzOMaFVSNkd+BSsycaNOaqyIqRGIZhYhS2z2YC8tbV41BQ2YDu7dLQMTNZJU4Uy2zZNIFYcPdkbDpcicmDOrhFkscAQYHEUXqyMYBrnFsMqe2z9VPjlAatWotpP8tpmjT0meS+HFwFLH4R2PoDsOU796XfKcAJfwV6Hedetwk0x7xcVSMUgVmCHDyi11S2JY9VXluwE7/tLMEJA/IwdVhnHde4Nty5KCGRo2KJipKKHEkPIe3vpx6Wst041rgFThhhHHVFk/aRYRgmVmAhxASkY1aKuBA3TOqLNxft9jZOVQwSkjTpb73z0sWFkHsNyREhpUaoss6GKkkIKelxciREFkryZF+J/IQUQjLdxwKXfgQUbAYW/wvY+AWwa5770uNYtyAaMKXRgqg5JqVq17jwH09Oo2uQ0gljGUUEN0i1UvJLzCKAX4NERP5Zpd+7Oz5di4GdMsX3Pr+iHi9cPNIrlioiiAj12veFuN6cfgyGZ3drqd1nGIaJKjj2zYRFXkYyltx/Mu48dSCumdDbmxIXKDWOCJQal5Wib5YgN/9TkGuI5DOaDZ5Jslb4hCUeOg0FLngL+MtqYOy1gCkJOLAU+Pgi4I0TgI1fAU5H2/QRkhuqRlAjJAuoaindMJZRJm6B6oISVQTIKZgRlpExcVYjtPlwJX7ccATv/LYH/1mwC1+tOYSNh3x1Y2VyjVCwD4vdiv6HvxM3V+Se1VK7zjAME3WwEGLCpkt2Km4/dQA6Z6fA4kmJUyJDeuibJagbqlZrhJC2vqVSEkKyWUKDUiOkMUvQ1gwFJbcPcNZLwO3rgQm3ApZ0oGAD8MW1wKtHA6s/EBOEcGmOaXljI0KyINSKy1if8AdKh0tMGaQ+s5+oYjCRkV3jCqsa/H4bqxpsumYJQUXztplItZWhwJWDPbnHN/s+MwzDRCsshJhGMaJ7NgZ3zsQ5owKnUARKjYtECFGfIeUg79TUCNFEOaLUuEBkdQGmPQXcuRE48T4gJQco3QV8dyvw71HA0jcAa20r2WfLZgkRRIQk0SRH0WIZJQIoT+DUoigxRYAcGWUhlNhCqEgRQjr1k0RFndxHKMjvyer3xNXnjhORZPHVgzIMw8Q7LISYRkFiZtYdk3DbKQMCrqM3RfN3jbMHbAAoHsNFZzjtujnuaw+Uqw76kUZR/EjLBU663y2IpjwJZHQCKg8Bs+519yJa9DxQVx7kAZq3RigS1zh5u3iJCCk6UJ74q2uEkJCohWFb7gnTFsiip7Cq3j9tWPpNlFPjAtYIle0Ddrnd4mY4JiPF4muezTAME++wEGJaDL2IBtUNKUKIiuG1EaBSz4GbUu4sBpfXVEHv7Pd5//kdn6080PjUuEAkZwLH3yZS5taPehQHnB2A2mJg/pNuQfTz4/jPD0vwxsJdLVojpFiEh4N8tpeiaPGAEgmUIz9yo145HSiR4IhQYqMWQkpqnO//dHJo4fYi3PThKuwuqg4phLbNel18s7aljcUBVyfRQJthGCZRYNc4psWwaaI1SkPVzBTfx+5IRb03UkQHcMUswWwygAygbTZ341VCTxcs21Oqfs6mRIS0WFJw9tJBMOFFnGVcgpe6zQeKtgoL7mtdr+Jrx0RYc65AJ9ShALkRTUoLKuux/nAxThvWGUapzkodEWpcapw23TBWUV5P+WWQ53IJqoNUE9pQTmBM/CG/50ofKflECP2OXvPOcr/t5N8W34PZkbV1BmAAXik/TiySm2czDMPEO/yLx7QYVh1RQoKHJv5pnrOOJAgIpU+REv2h/kSpZnXNSziTPj3x1VQcMOEb50TgpiXAJR/B2nEkUg1WXG6ej6Svr8OylFuxOPk2XHrgCWD5W8CR9SFd5/7w7irc/NFqvL9kr/q55BohZ2KbJXhrhAJEQOToUCIhR8I4IJR4yL+DRdVKjVDoqLje76dr51x0MZSi1JWBOc5xYhmnxjEMk0hwRIhp3dQ4z9nGtCQzaq0Or8ghe+6DZXVelzhynEvxyPRAqXF6BC0IbirklDfkTBxofyIeeek1TDWuxEUdDyG5ZAu6G4rRveJnYObP7nWTMoHu44CexwI9xrtvU8qdh51FNeL6/aX78Ifj+0j737jUOHmSUxMn9tl6Jhkq17gEFQFyahxHhBIP+T0v9qTGyWjrJvW2U7CveBeUqPylYxKs4hYLIYZhEgsWQkyr1wgRGckmFPvS19FBExEix7lUIx24DV5xFGzSR49LZ0L1olDNTb3did+cI8Sl08ljcPeHizHKuAtXdT2CaVn7gIMrAWsVsPsX94UwGIFOw2Dsdgy6lSahK4bgMPKwt9gtiPRS3CJJ87PFoWuc8narIyBcHyO/HiyEEg/5Z0FxjWuUEKo8AvOuueLmp46TvItTLJwowjBM4sBCiGlVIZRs8UWEZLypcZ56IIoIpXpOTCriSD4TriUjxSyMF1oiNU4LmTzIxcrVSMNi5wh07Hgapl08yp0WV7AJOLDMfdm/DKjYD+RvgCl/AygB5fcU4LArF6ucA4GlB4Ce44FOI1STlYhqhKRI2JerD2LVvlJ895eJ3ua1sYjyWsgTP64RUn8PmsUchIlZIaz3/mvNUsh4hiLNfjVCaz+EweXAcucg7HL52iCkmDkixDBM4sBCiGkx9CIaSkQoPVl9sFUiQmSpHahGKFjfmExFCLXCxLDB5tA/I6vsntEEdDnKfTnmBveyysPA/qVw7FuKyk1zkFm7D10NpehqWgrMWipWsZtScY+zP1aae2GzsxdyaxyAc6j78STWHyzHQ99sxH2nDcZx/fPc22pe670ltfh5cwHOH9MdsYoS8QkUBUrYPkKNTJ9k4oNQ6b/aKFH7jCQUeEwVSEQJcxZ6DGoYTdEguy8aRLBrHMMwiQQLIaZVUWqE0pPVHz2qESIq6+z+EaEgrnEKXbJTsK+k1msnS/zvtz3YX1qLR84cCoPUhLCpyH06FNemkKlaWV2B4efDOegsLLIfjxc2mNCtdjPGGHbght4FSM1fhWRHNcZhA8aZN7i32fka8HQq0Gko0PkooPMIoMtIXPzqftQjGY9/vxmz75wU0BFKsSmPfdc4rhGSkefBuk5gTFwTqgxSET0Kcs0PfV6SSAjtWQiU70ODKQMzneM163NqHMMwiQMLIaZthJCUGif3FqrzRFvMVCNkVvcRClYPMbhzFpbuLsXBslqRI0/PQ0KBOH90d4zont2k/TZJFtf1UkRIaWgY6aS0wmHBfucwLMEwdB4xHD/YD6Js/waMNu7EMMNeDDXuwwjTfiTb64BDq9wXD5uSDdjj6oIC60Bg8WohkIy1nf2eg17DWEYRvup0OK4R4tS4xCZYijBRJP0maaPF3t/Q1e+5r3KmoL7GfRJKIZlT4xiGSSBYCDGtSrLJ5JcaR7cVO20FOSKkpMYFm/j2yE0Tj0FOdCSGurVL9f7P6mi6ixrl2SvU22Uh1NCownW5zkgIPaMR2109sN3Rw7t8+rAO+M/puUD+es9lA2r2rUa6rRT9DYfRv+4w8PMCse4pAJYmtxMpdZtcvcW1paIj4GzvdruLQZT3O5BrXKIGQ+TXQ5sSycQ/oX5n5N8krVgWIqqmGNjyg7g/K2ma3/bsGscwTCLBQohpMf54fB+889uegPbZstGBNi+dXONS/FLjXCpzBfmAn2oxoVf7dGw5Uom9JTXISUvyPadHfDUF2h+FBo1ZQqQRIZqLyOl1tVY7jDqpe1anEcjr774MP18se/rrDZizbL2IGJ3fpQTndC5x9y0q3YXOhjJ0NpXhZKx1P8CPLwNzM4HOw4H2/YHs7kBWNyC7G5DV3X2dlI6oF0JO/d5BiVojJL8eXCOUeISKhOZ7erPpfUYcJJzXfQI4bUDX0VheRzWElar1OTWOYZhEgoUQ02I8MH0wzhrZRaSorT1QrqkRkiJCSWY/FzmKwChmCV4h5JkADO+WhRtP7IdbP17jXZ+6ofdunyaE0J7iWvTvkBm08Salz725cBcmD+oYVtpcoNQ4uTA53Emp9iQ+9f3RC9roGT/QJKgIOVjozEFydiecc5G7CeJXS7fio29nCoE01LAPw4x7Mcx8CCay8d6/xH3RIyVHEkcakZTluVhS0LaucXI6nO//iRoRkl+PSJruMvFBqCigViddOLY73vrVfULKTtHxVe60OIy5BkWz/O236aQSwzBMosBCiGkxqEZldM92Is1NKyhks4SMZBJC/hGhNE+N0O6iGuGApgRNKHqizWOndI7eee7oBvXmUcRTIEHx7u978MLc7eKy9x9n6O6/HHGQx0B9hPQINyJk1WxOESEDDGG5Q8mTIPn56g1pWOUahFWOQd5l/zp7KM7rUSdS6lC2F6g8CFQcAioPua9JJNWXuy+FmwLvcFp7j0jSRJQyOgJJGYAl1X0xJMHsqHPbh3uaMzZPQ1VpGbvGqS3WW8Eunokuwq2NO3tkV5w8uCNOG94Zby/eI75HxoPLgJIdgCUdGHEhar/7zW87To1jGCaRYCHEtDh6k/x0bWqc5uBrNhnQNQ0Y1CkD2wqqceeMtXjh4pGSEDL6pXP0ae8RQiU1qG7w9dKw2v0nDhsPqdNB9JDT18jOWy8iJBNuvYZ27kp1TXqmdnr244H6DOmJJpvL7Hac6zQUq/aV4YGvNuDWk/vjrJFdPQOp9IkilUg66Lb7ptu2WqC2xH2hOqUgkPQRknL9nwFTMpCUBljSPELJczvgMrqf7r6d0xPI7QeXy+GXCiYH9xI1GMKucYlNuLWIdGLo3NHdvL9fVCuUvN5tmU2ptq6kDK85jQwLIYZhEgkWQkzLozPJlyNAFB3S1giRkxxlz/3vmrE47p8LUdVg9076KKrkL4RM6Nk+Tdw+WFaHao/BQqCIkJzqFog6q0N3fVkgNWaCIpUYeYWQ3v7o7bc9kBDSEU1KkXR5rRUXvP67uP3aLzt9Qigly33pOER/R+nMc12ZWiyRQFIEU3UhYKtziyXlouBoAOroUobGstZoxr6kTsDWfoBhpBBHR9mrUIN2KEA7do0L1XSXFFNNofv9qi0GBvoXxjPx5xqnkCPZ59N5nCxHDVJ2fO9eMPYPwrBF+1AU+Q7nt5FhGCZeYCHEtDh6h1VKh/PeFjVCmoiQ52AsCyRFmJgoIqQ5a0kRISVdjtaTI0I0WdxwsAJfrTmIO04dKKy69cwJZKjeZ2t+lfe+POkOFBGyhWrw4V1Pfb+mwe7XV8m9D8EjQuo0OfeDjuiWLSy9qZeIMkn+fOVBVePZsKHXKC3XfaEeRiGwWa2Y/eM3mHbyJFhcVp9IstZ6bte4r601GgElLWuodKfxle1FksOKAYZDQNkh4PdF4jleoj8pQK0rGbZ5vYFtg4VAQvt+nuv+QHqee9/jFPoMGOBEe1ShY/UWYMs+tzD1ClbPddVhwOn5HhhMwEOFgIl/8mOdcE+4tEv3CSGKCJ1j+g1Gez3QcSjQbSxqa6x+26SwdTbDMAkGHxWZFkdvTpomC6EUs98BWHFpS5EiP7UeAUJnN7URIRJBittRg92BKlWNkAuvL9yJmRvy0a9DBq48thfkFjvebusSd362Dt+vO6x6DD3r68ZMULSZehQR0hMoemf7ValxquiQ+/aQLpno3zEDX6855BVK5XW+CU8oAdgkDAY4jMnumiJLE2uEnA6c8OD76G3Ix5UDbJjWuQYo2YUDuzaii7MAaYYGoHIbsHmb/7bJWUBuX7c4ImFEAimdbMQtgNEsXUyASV5mkm5bfPdJeFCaXmtFoOh5akvV6YpekXMYw0r3Y2vyYSQb7MAuuC+BMBiBjM7uui6qCUtt1zpjYFqMcH9nclJ9zplU4niZ6Rf3nTHXiO8q/e5o0Z5gYhiGiXdYCDFtVCOkTo0jIUJ1Qr6Gqgav4QKlatDBv85qD5oapyyj1DVKpZMFhdKL6EhFnfcxFGqsdjw3e5tIx3vozKFimSyClMdQaAgUEQqzRsgvIkRmCYaUiFPjZJc6RfTQ6+VyOVWpcfLDBDJ6aC1IdB4qrxN9n4LhMhhxwNVRXAZ26INpp7vfl0v/MR8F5VXoYSjCU5NScVxOBVCyU9iHo2Q3UHHAHVU6stZ9aQZI0p1NN+jhZCFFURbxMTJ41L50LRZrluleK9t7rkWfl0KAztwHQHxSDKTPDKgy5yK7Uy+N219X320SQRwFiitUNXNB6JTl+00ZYdyNodgHpykZxqMuFsv06oNSk9g6m2GYxIKPkEyboHaNM3nT4JSDc7s0C+CZs1NUqMbqEDbTXrMEndQ4JYpEQkhbI0R22QSljGnTyrYcqcL7S/aJ23dPG6RbLEyPUVZjRU6aJUiNULipcYaAtUgyeoXw8nOoO8Y7fSmFHkGo/F/eJpCIay3u+XI9vlh1EM9fNFLY+gYimFOcHWbscXXBkY4jAe1j2OrdqXVecbQLKN3tdsYjNzuHzZ0uRrfFNV1smvt2wCMm/XfM8//WIL2D5NbX1Xt7Q1UGbvo+HwWudjilf3e8cdXY1tkfJqZqhDpn+4TQBa6fxXVVn+nIplRXTyRaC6fGMQyTaLAQYlocvWysdNk1LtmdRiU7x3XNSQVK3bdJ9JAQIptpJZpD0RsZEi9KXRFFj8rr1PbZingp8DQbVNLsiD3F1ar6Hz0hRJOG0U/OFZa0TXWNUyJCFBVzCzy7V6iFejyVWYIkcJQ0OaoFoPoRsUwnIhRIxLUWJIKIf8/bEVQIyek/8hnwAAZyPqjnUcfB7ktToNfWI3ps1nrMnf0Tppw82W2j7hVMSrqcS0qbU267wvufdyDSelTjRMLHnKy7a+U7inDQtTygWyAT34STGkf92sTJJKKhGlNdi8XNksGXQemapvyeyrBjHMMwiQYLIabF0atLUTVU9dyWDRO6ZaegwSOElDoh5QymOyLkL4TIREGhpNrXKNDqcPkLISl1jvoUKVBEKifIWL5bdxjH92+v+79wrYwVIZSbkYSa0joxLqpr0qKktoVlluBZlybqRqoLkYSSHBEKJOJam1ClSnIUSC1+5OUtWLNDhWhGqrFIAgwW2MwZ7r5JTa19agbUFuqJ6ZyXyIQjhDpnpcCgfMk2fYV01GO3szMqOx7jF4nOTU9Cqcc4QamzZBiGSRQa9av32muvoXfv3khJScH48eOxfLn77KQeX331FcaNG4ecnBykp6dj1KhR+OADTy8DJiGgA60WbUNVrRASESHNWUqVENLWCJmN4iyoQkm1VSUSFKGhpMZRJEZhR6EcEQp9hr0hwDpyzU4wlKBMblqSV0DJLnfBHk8thOQ+QkqNkAEWz+tg87gyyKk0USOEQvxfFjmOQKIoBu2zi6sbmrzfznDts5mEFUJ5GdJv7qr3xNUMx0mQdbPye+qNHHFEiGGYBCRiITRjxgzcddddePTRR7F69WqMHDkS06ZNQ2Fhoe76ubm5ePDBB7FkyRKsX78e1157rbjMnj27OfafiQEePGMIjumTi1cuG+1dRkJG8SuQrbQVuuX48tsVgeNLjXP3GZJRTBWU9LgSyRpWpMZ5xEtFnU2IATktZEdhVch6HZl6nehNYyJC7SSBWF5ri9g+myJd2nVNRiMsntdASZtSmSWEIfRaA+/Z6gDI45SFg3w71nqJfrnqIMb9/Wf8c7aO010EyO9nuOmYTPyg/dzrfZXaeU6yoGATcGgl7DDhS8ck1fdKjggpKC0IGIZhEoWIhdCLL76IG264QYiZoUOH4o033kBaWhreeecd3fUnT56M8847D0OGDEG/fv1w++2346ijjsLixe6cZSb+Ifeiz/48wdfI0zMRVqJCynWZJAaypGaA2ogQCZ5AE2klUiSnxlH6kFwbU1jZ4DVeIA6Uup3kCMWsIdg8PZCYiFQIpSeZvfurJ4T0UuPk56BGqde/t0Kk6ymih0SQYhrhqxGSUuPsjqiIpNAkjOqF5PdJRi59UdULqSJCiCke/W6TuH59QTC/69CoLdSjQ9gyrYdcF0YnftJ0ojjZSpTHEw363TwexchWbaucDPKKJk3fNoZhmEQgohohq9WKVatW4f777/cuMxqNOPXUU0XEJxQ0AZs/fz62bduGZ599NuB6DQ0N4qJQWVkprm02m7hEirJNY7aNZmJ9XOeP7or1ByvQOzdFjEHJU9eOLcljpU2mAoTB5T9m5T5FjyjtrVJyjau32lQ1OIfKqr2PpaWmvkE8FtUb2QPMtOt1ioyVVLVQ7wX9X+kjROn4lA4oXO509oeW1zdYVVbf2nS4n7cUigu9loRBqqGhyJf4zkjbiBY19VZVGmG4rNhbJrYb2d1dbv3JigN457d9ePvqMeiZmxbR5zG/sh53f74OQ7tk4tubJ/iP3aZObVQeUxZxNru9VT77zfU9U6W0NeGxrNK2Vrv7PW7JscXq70u8ImvfnLQk3fpC0UOIGhSv/1Tcn508DahWb6sYxtBJJ6VFgdy3jWEYJhGISAgVFxfD4XCgU6dOquV0f+vWrQG3q6ioQLdu3YS4MZlM+M9//oMpU6YEXP+ZZ57B448/7rd8zpw5IvrUWObOnYt4JFbHNYYu3YF5c2aJ+9UNZr8x0XVVOR2cjSgoLhNT/fz8w5g5k9zHfOvPnDlTXLvsdEZTHc7Zsn0n6ht8/V1mLVyKilp6TP+wz69LlqN4swt2Z+CvRmUNRZAMSDa60CBZYZPgUvYjHPvsgiOHYHBIfWd0+PqHn5Am7UpZuf/4iP0H6PUwYsf2rZ7/msSymTP3Y/8B9+un8P3MWUiN0CYlvxZ4Zp17o38daxdpjY8scd+//d1FuGGwM8zPo/qJNx+p0n3Nqmy+dQ94xkE0NPjGv2HjRsws3oBY+Z7ZpM9mOJ+TQKwupsdwn7kvLa9s0mOFM7ba2tomPz7TfMg1c2TnX1TlHxUUdT9bvgfqK4DsnlhvorTkalVESEmNo5MxSosCrhFiGCbRaBXXuMzMTKxduxbV1dWYN2+eqDHq27evSJvTgyJOtI4cEerRowemTp2KrKysiJ+fzmjSgZ7ElyUKXJ+ai3gb130rf0adzSnS0mhMyth+KN+ELeWFMKek06wMPbp1w/TpI3D7kjnebadPny6uX9j2K8qlVDeiV+8+sB1y9wkiuvYbAuvO7br7MGLkaEzsnwcsmx9wP10mC81qkZ2egsIqKbXLaML06dNCvmc/vD1P3B7QtzeKd5egtNDnWqdA7k2Ugjf+hMno0c4n/l/d9RtQ679+p85dgeJ8jBg2VJhJfLNvKzp06oLp00dizmfrxf8UJp10Cjpk6lszB+KJH+lEh1uMTJl2mkjpU17/rHZ5mD59XFifR/k90753MuJ1XblQ3O7S1f1+Ew+tmQ843NGzoUOHYfqxPREr37N7VvzsPSWvN+Zwsa87AuxwC8DUtAxMn358i45Nicgz0YGcGkmmCHrppQM6ZQIr3GlxGHMVjBtMftsqqcaUDkcCyC2EOCLEMExiEZEQysvLExGdgoIC1XK637lz54DbUfpc//79xW1yjduyZYuI+gQSQsnJyeKihQ7UTZmINHX7aCVexvXOH47BEz9sxpPnDPOOh65TPT2HlFQOs9nkN17lvt4ZzTolF83DwXJy7tLfB6vTAEeI0jnFeCEjxawSQpTCFc77oNQIpSabke7poaQlM8WCelsD6uy+sRGBypCUmvnkJIvXRpyW0bbaTWh8kXxeaPL0HU2+PRiM9Pr7fjpcMKgeL9LPo966JpMv3cdlkB5fGoyBjCFa8XOvNy5Ksfz3/B2YPrwLRvYIZryu7nvUlP2mccvpkc3xGgR7z+LhtyVekHtqXTCmOy45ugdu+nCVap3bTu6PaZ2rgH2L6cMCjLoCpk17AwqhNIvZ+7vJESGGYRKNiE7/JCUlYezYsSKqo+B0OsX9CRP88/wDQdvINUAMQ0zo1x4/3X4CxvV2dz5XUM5SKqkcUsmMH3quR9VSvRCxp9g/oiLX1cgW08O6ZgU0McjUuN3RHEOeqARC8W2gLu5yPyWZrBT3Y1eSEgrDOldtlmDQmCWot9GrKQjG7qJq4bYXyLJZ7u3TXKgts/VvR4NZwn8W7MSbC3fjnNd+C71yM+1vIAt1Jv6RzVIeOWuocOOUjWN6tU/DXVMHwbD6ffeC/lOA7G6i0TKhdo2ze1PjlL5sLIQYhkk0Io6DU8raW2+9hffee09Edm666SbU1NQIFzni6quvVpkpUOSHUi92794t1n/hhRdEH6Err7yyeUfCxC2KuKnx2mcHVkLa/kKE1oiAJvbhCCHKv//xthNEc0I95F5I8kSFhMYP6w8LV7dgESGafKR5ol16ESGiqt4WljOdstwkucYp1srauXKkFtra10/bxLMlbKxlQam6LT1XizZUDZO9JeHXzzTX/qpMF2LNQ7yFiaTHHVFeXo5bbrkFXbp0EVkIAwcObJaaq5ZCfu+V30H551A0r7ZbgbUfuxeMvca93Oj/+yGnxqVyRIhhmAQl4hqhSy65BEVFRXjkkUeQn58vUt1mzZrlNVDYv3+/SIVTIJF088034+DBg0hNTcXgwYPx4YcfisdhmHBQIkLKHEAc7AOg54amncgfrqj3W4fOrC7fU+oRQk5vxIawmA1hCyE64/rSvO0iSnDqkE74v2vGBRZCZpOqiayMYh8uu98pj6+HInpIBClCyKpjnx2sqSoJDkr165ytFn7a3kpywTXREnbcAaNAUlglCnQQsiWb99YSQrKw5Yaq/j3uqKUDiaCXXnpJ9Lgjl9KOHTvquqBSbRT974svvhCGPvv27RPNv6MV+fuvpMDKv4fi5raZQG0xkNEZGOCuWVQiQvQZ3HS4AruLarA1v8pnluAVQlwjxDBMYtEos4Rbb71VXPRYsGCB6v7f//53cWGYxqI9SxlpRCiQVTY1EiR3JTJHoPQSEkLUR0hpmKr01FCEhQz179A7e0p9XUgEET9vUdfS+dZRxhU4IqSkxoUbEVImxGaTQVzkZdqem4EiQn/5dA1+XH8Eb18zDqcM6eTXW8n7XJqaq6bO7612p5+AlSd88lw/2iJCshAiQRisUWxz7a08bm6oqt/jjiBB9OOPP4oed/fdd5/f+rS8tLQUv//+u7cOiqJJ0YwjnIjQao9JwugrAJNZte6RinrcOWOt6ntEQsjb0y3A7xHDMEy8wr96TNSjFTfBIkK6NUIeIZSRbFZFh6jRK9UkEf/4yW3/Xmd1eiMmyvMm6QghEkFUj6PFEcbEVNERtK8ZAWqElNQ4bY1QoBokRSDRmd8kv9Q4Z1g1QiSCiDcW7lIJISWFJlATT+0e0T4+9t0mUV910bgeCAWJvfYZanMUdS1QgNtAVAkh+mwp75sezaXbVKlxHBFqdI+77777TtS2Umrct99+iw4dOuDyyy/HvffeK0yBorG/HfUVU3A67LC5qLm07/+dnAVw7fpFmLTbRlxGD67qL7a/pNovlTXJCFx3XE+0TzNjYr92zdI3KtZ73CXauOJ5bPE6rngemy3McTXXuFkIMfEVEdJJ7VDMEmjSSpOGKs/9dCktTcmRp2iQkgqmPK8SYVHvk1F3eYnUFFYxLQicGmcUDRH1yPI0+om0RogiVUoEK5BZAkWEXpyzDb3z0nE+NXIKgTYipI1CaCMzszYV4N3f3S5VshAKlEJH74dWCMnze7Vxgv7zknj7dUcR3r7m6Fatc5CjhWU1tqBCqLmQ308WQo3vcUd1q9Tg+4orrhB1QTt37hRp3HRwffTRR6Oyv53cX2vWTz+J37P6Ol9/qgk184XoKcoYgt+XbKZOXWJ5SZG7l9i23WSBr/6NXLtqOfplAZNTgd9+OYDmJFZ73CXquOJ5bPE6rnge29wQ42quHncshJioJzkCIaQXvanyRIFIeJDxQVW92ywhTarxSaXToqIpKqXGeWqEPKJKLzWOUknMOsvXHihXTVjpot1fpaEqTdgpPU+PLCUipBFCgWuEgqTGabZZsrsYHy7d7xUhB0prcc9pg73/N2gatmprhLSTb+0ubfHUHmjRmiwoKMJU/Zj64kcdHfItVyJ6X60+hMvHt3xvIe++STtXUtOAnu3dE+KnZ27BugPl+OC68bp1a43l27WH8NvOYj+nQmMwK0UmoHsp1Qf997//FREgckQ9dOgQnnvuOV0hFA397ZT+WvR2n3GGr3daSYO7d9oU40ryx0fuxD9i+lhfr6qZFWuxoawQmbkdSTWqHvPkSRN13TGbQrz1uIv3ccXz2OJ1XPE8NluY42quHncshJj4So3TiQhRDQpBE9K8jGTsKKxW1eEQKVJESEmNU6JEukIoyaybGrdmf5lqklpaY/VrXqrYZ9O4RAf4COyztUYFwcwSFOGhFUL5Fb70nke/2ySudwZx0vOrEdJGITSRnkPl6oa2Cop5gxZt1Eu7zwFd43REoTVCa/CmIkfoyiSXwP8ucteJzd9agNOGd2mW59pVVI3bP13rt5xSFZONie321Zged+QURwdZOQ1uyJAhwgSIUu2oXUS09bczmnzOmco2Jo8RQndDIQY5dojeQabh58EkPSb1XiNqrf7fQWoM3VKTqHjpcZco44rnscXruOJ5bJYQ42quMbNFDBP1aFOdFP3x0iWjhLih4n69GqFMSeiI/1lMqjPn54zq5vccFP1o8Ez8lWV6KW7U/0cvIrT5iPoMRZHUcFUvNa5dgNQ4r312Q3gRIUWcuO2zDaookRKIUVIB9dKpFmwr8t3RDNevRiiEfTYVZOvuo6IANWid8QK5xmlT6/ReimDRwpZArr8qqfa3S4/UqjwYBZX1YUfa6HN85f8tw9uL9yARaEyPu+OPP16kw9F6Ctu3/397bwImRXmufz8zPfvGsA3DMqyD7IuAIKKokUVBo8YkajxRicf8XfjHExNj1CMEzRGjOcZcHo7m6FHznfhFklwu54tIQARxYVEEFRAUZZd9mw1m6/qu5+1+q996u6q6upmhu6vv33U100t1db1dTdV71/M89/OFEEi6CEoV5AUP9XcurwvNzF4TutP3fKKSrpb3ccqsGmEe1auD+Rqc4gAAmQyOgCDtIkJyEnDV2T1p87zplsJ+dVnuA6Svp3enQvPxlCEV0RGh5qAZATFrhBQ7eGtqXPSk+wstLexQXaOjWQKLuI7F7jVCTg1V5cRGIqNYLIIi9tlWswTpDBVvXYlsvGhuf1RqnB4RikzYVfHi9Ll6+l9ondFj1kuM7Bq5yqvjUesLGsIt6+kVX1Fbog6Jo3/Rr7edpYNTJNSuqeqne47Te9s4BXInZQrx9rjj19k17q677hICiB3mHnnkEWGekKrI/2vSOlv9XcwIhIXQsKuj3iePmTINtWfHQpp9cbVII3XqkwYAAJkAUuNAGkaEIpMAPSqjRoTKC/NoN520CKE7L64W9380qZ/F6limwZ1U+wi5XCllUZFrM+muD0dPeHKxv+aUbURIBkbyHCJCXOdk11CVJ/NyXs3fieqAJ8Ubi7Zos4TQMrJnkZ7qppMVKzVOm9xba3isESEWAlIwOqfGtbgKCCmAgp4iQrYfQau3H6FX1+8V92+/aAC1R0ToaDg1ThV/qtFDewkhu4iQTNmT0c1MIN4ed1zf849//IN++tOf0siRI0UfIRZF7BqXqsj/F2pkm+9WZR2gUdlfUytlU2DwFVHvk8JJHjMKc3Po59MHnbHtBgCAVAVCCKQ8BQ4RITvyXCNCAereoZB+fdWI6M8Ii55QQ1Vpnx1w7FdTkmcfEWJ488b27SjsqA/bRYQsrnGRbezeoYDmf2cEDeleRscbmqPSxtRJNW+vumpTCAVsUuPCk3XZs6jmpLvlZFas1LiWoKU+R53417dET9KlNnU2S2j2lBqnCx/5uZYmkw4RocY2TFFTUffJ0XBqnLUHUlsKIfvn7SJt8rlGh3REvxJPjzuG0+ZWr15N6YIZEbIIoSyakb1W3N+YO5JGaWlxjDxWyf9rTo2cAQAg00BqHPCVa5yaGqf2eNFf0zHts5tbTVEhG6raNa0syg/YmigwVZ2KqFd5KAXPNiKk9BFS18GNXy8aVCH6G8n6Jp642E349X5JMopljQhZ38d9lJxqcnT4M7fsrxETaikMze0PBi29hFSdeFgrY1GjQE6pcbaucaqYMIWQvW23NMNgdhyup6eWfRnVRFcVd0423m1lltCSoBDi7dId+lScmrXa/T7l56rfDUhf+LexdX8tfX2oPio1ln8XMwMhMbeqINQXTUceM+XPEUIIAABCICIEUh49Rc2ra5xdjZDzZ0RqhMzUuLDYsJvMsqjQ63Qk/bsUm05xsVLj7NLqmLKwiGMxw9vDokydYDul7Vnss4NBMYEyJz/h5q12ERgVts/+f9fuogde3UgzR3S3NUtQJ9+qQKlt1qzCFfHjNCm3dY1zsM9WkYuo6/2P5dvM2qyHrhxuK575e3Tq8XR69tlNUeLPLproxC1//Ije3nKQVt93CVV2KPAeEbJxEjRT4yCEfMGji7fQH94JORHqx8Aewf00Mns7tRpZ9GHheXSbzfvVmiL1Ig8AAGQ6iAiBlEePfjjVgejL6vU3dtbaUa5xzaprXLajZbVTHyFmQNcSqggXIH+jWUlzulowXIWj9zxSBZeMUMltEq8r4sOpaSjXLcn18hyc1ym3vzicGufFyYwblDJvfLbPto9Qs8Nk/5QW0FAFU6yI0HPvfi365Ih1BqPFhlONUGNrdBRl7fajlsfqxLEtm5Cq4rShsTXKHc8uWuMEiyDmlfV7bF93EoR245Gfy6KsLSNgIDls/sbqRqkK+wua3xN/VwWHUm2go+379ZRRRIQAACAEIkLAVxGhPNfUOOeTv7xCKswSwr1opNiwm8uyEHKaYFZXlIioEPP14VAqi0SNFrg12pQ22Bx9aQxvj7VGKOASEcq2TNSlqPA6+eGvV72CrJsl8CRbrfdRvwZdCKmTdKcaIS7g3nWkgX79xufi8RUje2gRIfcaIbtIkypQ9N8ML+/gWh43qniV+1b97EQiMvrVe7vPUrETW6p4521w+r2A9EC/GKH+ns9vCgmhN4LnOkYN9XrGwvBFEQAAyHQQEQIpj0xR85Qal2CNkDRk4ElyffjKvozKqM5gEu7JY2erzQzr0YH6dy02LZXf2nyAdh9tCK9frfNx/+8nhZss9JeTW57sOKV2cbqe+hpPzs2IULhGyAvqdyxT42TdEqdi6RNtJyHU5CE1jtevru9wfaMl+hOxz45dI+Ql6vObxVvp3r992iZGBhYhFN4OdXv0+iovONXAxeoh5bhdbRgBA8lBT081hc3R7VTdso1ajGz6R+s5jsdG/fkiCGMAABBACIGUR09p82qWEJUa52aWoERLToRd1eTn2l1xd+ojxAzsViIc2nqGDRP++f/5iK55+gPLpJSH4JRap2+vFBqRHkIRQwQdXqdq681pWnIezE1gvcBzJnXeJK9Gl4UtvXmdTilvp1qca4ScxAkbG6hGAAdONGqudOQQEXKe6Ov7TBUGf167ixZ+tJtWbA2lop0O6nrlfrJ8HwkIIafaM6d6IzuBpI6/vRzzQNvD/9fsIs16VNaMGm5+zUyLO0pljkJI/00hNQ4AAEJACIH0iwi5CqGAo1mCWyqa+hnS/UumE9naZ3MfIQchJN83oKLEfO5g2DRBRgvUbZlU3Vn87aQ1V5VCSL5H7SrvNFlmccbfjxSLnKalN1T1gio25SRMGjjwOi0mCOrEX0+Na4kdmahvarFM5rn/ksWC2nCKCJFjREj/LLs6rw++OkKni7qd8jtRUwDbMiKkp/u5Pa8+h4hQenCw9hQNmbOYbn7hw6jXGrSmxuYxcNOrZloc4xQs139TMEsAAIAQEEIg5eGTvmoe4FRDweTlZLn2EXL7DJn6tfNIKI2tb+dix4mmiAjZpMap4mhAOD1ORUYNVKOE3107mmZN6kt/+T/namOREaFwjVBQEUJOEaHwhEduB4sE+b5Sj0KIXePUK8uRiFCOkm4XnRIWKzXOKSLEJgO6EFK/cilEdT3qlhoneyi5RU3W7TxG7ZEaZ40IWaN55ra7PHYS+vp77LYh8pySuphBTVXTmf/d8I34+84Xh2Kmxolj4NGvifZ9Ipqo/qN1nHjeKSKkCyHZUwwAADIdCCGQFqhpXW4ZZepkuUOhd9c45rLhleb9s7qViJvTRJNrhOwiQmP7RFybyrXP54iGnCyraXoVpQU094phVF1Ral8jJFPjlGaKTlJQijOZHifMEsKbXxIWMolGhGTNVcgswb72x8ksgc0QFm/c7ykidOAECyEjpmucaZZg21DUuqydmN2490RUxGbnkfq4aodUUwe5HdZUwbCTnLaNuuW1OgYnoZ9oRAgW2umBU5TXzixB/P/cFEqL25g3mo5RmbjvtIpoIYSIEAAAMBBCIC1Qr2C6mSWoE+CyQuvEP5Y5wQ8m9DHvXza8u1m3UtWxKGZEaHBlKQ3rUUa//d4o87lLFWElJ6RywuuWpqcLNz0ixBMmp7m6FGe54fXzBFymhZXkWyNkrq5xNjOq0nCNEEdb1BqUkDOd4WqfPfnx5fT3T/fZfh5HTVShoKfGybv6mN1S43ThYVtHEzToywN15mM2tbjw8RX0u6VfkFf05ql8s0uNi7U9qliJ1yzBzsxD3T9oqpoeOO133n+62A0JoVBa3JrCSBNVrzVCSI0DAIAQEEIgLVCvYLqZJfTqGDIosOvT45Yax4zq1YHOr+4iUsC+f06V+fxvvjuSpg7tZokY6WYJ3x3bi974yQXUSxFNgypLaelPJ1uK1s0aoRhGCaHtzba6xik1QnZ1SyJSFJ4ISUHEE3A5T+a6Jq+o5gUSmTrYxA1VHSIap1qdzRLckL2EmAMiNS62a5xB3u2znaIpbN0t+epQneWvF/R0NTFptUmN080b9O1Rx2D33buZJejr5ugBIkLph1NKpB4NYnoY+4j2f0qUFaB1hZNi/nYQEQIAAHuQKAzSArXQ300IVXUqohdmnUOdivLEpIAFh9coDC///M3niEm+GoFi97dnbxxHz678mt4Mp3eFUuOyY6a1cE8hfonnpZwmFVdESE+Ns0SE7IVQZHtkRCgiWqSQiYVYtbZ+FmURFz2O4GgT+dYgFQZ4jNZ1xSrUl99N7amQUx+zT0uNkwJIH7EZEYphHx16bL8dJ5sjGyy/53iEQ5SgaY1E/VwjQjbfn+S19XtFQ9tn/mmMJV3SScypY/1wx1G6/r9WW6KfiAilB+oxhH/zUtQ0KL9RyQWN74bu9JtM9U3lbDofX2pcLk79AADAICIE0gL1CqbTVU/JxYMqaFRVefgqa+R5aWftBgsUp0JidSLKZgXqxMVJnPG2Shc5nhSbZgmehJA1Nc7sI+SQGqdGmeT6RUTIcI8I6SYK/DkykqGm0qh1R3oUQk62ZWqcdMALRaSMmAK3RhFCXCOk6gZZh+NYI+Rhom9nga4XocvvmfcTr/tfX/uM/mf1Ttf16oKLt8WSGid7C0W52GmpcUqt0nvbDtO2g3W08ovQ5Fbi9D2q6+K6J35cbzMukNoElIOVKsZ1owTmvMZQE1UadrXFKQ6pcQAAEB8QQiAtKFbEiZtrnI46oecantNBdyJTndvcLL2lEGLTATnhjVWvJJYJR2DkRF8KAZ7U2PUakZ8jl2FUMwAnswRpi62KBlnkrzZglBEwntTrxf4y4iGFkHTs4+frNOtfleLwflVT42obW0RvoZg1QuFN8CKEnOprLEIo/FvhSei7Xx6mP63eRQ++tjGu9QpHPeV3Ive3W18j+T4dfR841wjZ93Qy142IUFqgZsuqQkimxsnDXp+s/dS/5SuRFkeDL7eIH4cez5bjEx8bvFyIAQCATADxcZAWFHl0jXOiojQ/ZgPTWDRrE1HVNc7N8akgPOm4esEHpgOblxohuYycFMWqESpQXPGkaFGbafLkR00VlOgpcxxR0N3UCvICZk2USI3TJtc82ebtbDFCy3Bq4tdUL/oIqSLHab/WhJvYStRUuWCsGiEPdUhOaWVq/YVcD0dQZC+pWNhFhLykxkXVWNmIFT0q500IRS+DGqH0QPWCVH8PUqx3Ls6nw3WNNDN7TeiF/hcSFXem7KyvIuvwEBFCNAgAACLgshBIC4o9usY5MaZ3xNY6Ua4Y2d10iGNU1zi3bVIjQhLp6pZYjVC27aRY7bUk169+Jk+G7CZBURGhYDCqQLtzcZ4p/FiQ2RX7q1Gc8qJQahyLAlXU6BSH92uNJpbUSI1zH6HIZ9sx/XcraWW4J4uTiFC/HykaWYA4pdLFnRoXXqcuUOzep6P3/1Gtup3WZbfdSI1LD9T9qO4z2UyV/w8yMwOrQy8MvUr8sUSEHM0SIscbGCUAAEAECCHgK9c4HTkv+N64Xqe9DQO7ldLq+y6h12dPiooIuW1TviJQJJ5c46R9tkyvUhqq2s3r1dS4vPC2qZEdniSpYklSFrbFtqbGWSfm3coKrKlxWoSDn5MObGwkIaNTHD1yiwjJ/lBqjRCjiio5QdSjYPKxU8Rj64FauvH5taHt8JIaF5588l874fTJnhP03LtfW2p1WmO5xjn1EXKosVLRo3JOYk4dG1Lj/CKEolPjOHLbN2sfDcveKZqo0pAroqJAzmYJkftopgoAABFwRATp10coDiG0+K7Jwg75kiHd2mQ7KjsUmPfVVDs3IaSmrEny4zJLsEaEhBCKERHKc4gI2V0N1vst8WS6yUYIyfGKiJDNRL45HP1gUwYp9NgBzi36VWxTI8Soxf5S/+gBEfnYW42Qg2ucUr8kv2cREVK+X5mS92+LttD63SdoZK9yGt+vU2i92kbpIlGKGT0Vzq2PUPypcZHl9Notp3WD1MNiea7seynWOZo7I5wWty4wksYXhX6D6qHHKSI0tHsHcRzi39Q5fU8/Og4AAH4BQgikBTJyEK9ZAvfy4Vt74MU1zkn0nI59tmONkCJypBBRIx4Bp9Q4LSJU3xidSlXJEaHwGHlSb1fj0twSjgjl55jRoz+s/Np1jEXSNU6rEVJT82K6xsWoEQo1lfUSEQrXCDW3WsVFWPSdONkSta12KYLcZ0nCE0/ezqYWvY9QMLYQakkgIqR9jtO6Qeqh/iYsqXFhMc0XMS4PhITQW1nn0Xgb8eN0aORj4Lp/nSoirV1L89tnAAAAkIYgNQ6kXUQontS49kTtI+QmztSUNUm89tm7jjTQyx/uNgWYXQmLNGUIvTdgmejz5mU5pcZpNUJqk1FJtw5qapxh20dIvq+kIGKsEAtOo7OPCKmucVIIxVcjJNlxuD6qb4+tWYLSR0gVF3KCKiM9qrAIxnCNk8tH9RHy4hqnpcYFvdQIISKUtqhRVmtqXOj/Qh9jHw3N3knNRoDeCp5j6xTnVqvIFygqygpith8AAIBMAhEhkHYRoVQ5j6uTfVf77LAoSbhGqCVIkx9fbhGCdhNnNdpjpsaFJ1EyemUfEcqJKYQ4IrTvxElxv8Vmsi9sssORpJK8SETIq8DVa4QalKiUnNvvPtZgKwzs6mJUPt9fG2eNkNUsQd6X33lTa6trREjfHhY0ukCxe18sAaO/h/exqElCjZCva4Tkb3Rcwzvi7wfBYXSQis3XvdQIAQAAsAdCCKRfRChFlJBsMMo4XKw/zRqhkGjhaJAuwLoXFdCne044Ci69RkheKdZrhPjpDlpEyI5uZfl0pK7RMdXsHxsP0ICuReaVZ699SqTAdYsIsYi456+f0F/X7UmoRugnf14f9RwbXXBUy+Iap16FV56XtulSZMjP4+9Drz3SU+NkepyeGhddI9Qat1lCPluhtwQ92GfDNS5V2V1H9O0Fq+j+mUMs/6fU37SMWo48sUL8/XvwXGoMWk1Q7O4DAACIDYQQSAtkClUqpcapESG7Bqenmxonl/lo5zHL8zzZeejK4SI17KuDdfT14fqoaI8UWvJqshkRUrbl6rN7Uv8uxcLcIBZslvDFgTpzsq1PuBd+tNv8zJJ8br7qMTUu3yEiZLHPpigRFHreSDjiwfbeh2obLalxaoG6pQ7IFECRz/vv97bTw3/fHCWsOFrkKSLkyTXOPZ1O/D4aretCRCi9eObzANW11NIP/3st/WzqWQ722a3UL2sfVZ78UqTFLWkdR83hHlqMejhE2hsAAMQHaoRAWiCL6uN1jTtTQsgh88pZCHlJjXMQSyxqWJg8e+M4unBQ18jySuQpkhoXjgiZqXGR7/G+GYPp/14y0FMaG4/BbKjKZgk2E24ZUSmKIzVOClxdR6r22U7I9zS6pMZVV5TYPt+xKBQFa2iOfI6abnjCxhBBrRFSRZAqMNmsQP9u2PQgZo1QAvbZch+rUSn7PkIQQqlKXUuWJ9c46Rb3fnA4nSDrb9oaEWrnDQYAAJ8BIQTSLyKUiqlxyhVaHVWgJOIa59Yc0dIx3sY+W48IqZGa/EBoea/GBlK88WRfpos5pbvFWyOko0aEnPASEZpz+VDb58sL86JrhBThcdwSETKE6IrUCDnXZ7Eo06NlHNnR3dx0m2svNUK6WYLcx5aUKheBCtK0j1BzC10ebqL6RnBC1PvUwyFS4wAAID4ghEDaRYRSJTVOjUy5RYTsBE08fYR0VPGj9jJShZD8TFnrIr8zdaIkJ9KxolMTwj1z5Oc2O0SEJMV5kT5CKj+dchb968whjiYYTjVCTnhxjXMSnOXhiJAlNa7FPiLE0ZxgjJok+d2HaoSiU+N04aO72HlxjYsySwh/xzyB5tRMrlmy2y9NqBFKCywRIWWfldXvoCHZuyiYlSPS4nQQEQIAgMRBjRBIu4iQmzFBsnCvEUowImTzPiagRHBkb5/Q50TXCJmpceHJkiqi5DaoYkqFGy/O/85I6tWx0LIcR0jcnNpY3KjbKDm7dzlNPqsr/fqNz5Ux2gshL/vY7CPkIoScIlMdi2wiQqoQarCmxqkfYfd58rsXLm529tkxHODsG6pq9tkOqXG8riff+pJ+v+xL27EiIpQeqL8bdZ+NrgmZJByumEgndkaneqJGCAAAEgcRIZAWqClUeqPJVMDVNS5R+2yH1DgvEaFIQ1WrfbYaTZP3nYwNeHLPNTZykm+mxinpXzNHdqdRvTpY3udUI2QnntT0wniRX7lbQ1Wn77m8OBwRUsSGKnAsNUKthqVvk50Qkm58Ifvs6PofXfh4qxHyYJYQft5JBDmtG6QeTjVCE06+K/4e7j2Dfj4tZKjw48n9zdfhGgcAAImDiBBIC9QIiprOlCo4Nbtsi4aqOmqNlFrfo0aQ5H05mZZpfHZGE05RE12Iyc/iib50QRvQtYR+NKkvXfP0KnM5do3T3LAFQ7qXRY/lNHJ5vNQI5eZkuUaEpP10lotZgkgFVD5Cd7hTa4RY7OnCzC5dTneRs40ItbSKqJe8yu+UGmfXRDXWukHqoQpds1fV4S+pX+t24RZX23ca3Tl0AM0Y0Z36dUEfIQAAaAsghEDa0adzqF9NKuE2obdNjfMQEXISS+pnqREVLxEhNZpkrsNhW/Tmq7kW1zjDTM0ryc+NssRupYhY/faoHjT7W9XUozyUYme3zkTwUiPknBoX2ebdRxvo7S0HLa9b+ghx3yRFg+w7ccq5Rsim2ayw1I7RR8huDNKgQQpSJ7MEfV06iAilPnzRwzYitOk18ee94HAqK+ksRE//rrprXOQ+AkIAABAfEEIgbXjr7sl0uK6J+nSOXA1NNrddOIA+3HGULh1eGVdEyKn+x7KMIoR4giPnwWoUSL1f4OIaZ0aEbGZKTq5xBZoQk6KiWUn/4tS8koKcqDSxk8rEv2+XYjqrW6ntZzjVJ3nBrBFKIDWutCBXTCB57nndf62m/TXR4kbCok/VEt8cP+laI2SfGhfdR+i/Vn4lomQXDOzqOAaO6EkhFJUap9RsuYGGqqkP/19XbdDNKN6mV8WfRcEJdLPDMQOpcQAAkDgQQiBtqK4opeoKSil+ednghFLc7CIzUe9ThE3vTkW080hDVETIUiNkaagasEyo7GqEYokFXcDJz2LrbDmx54iO3pC1OC+HahqDtkYXsb4H3r5YEQ6Jm4sbM31YN8eIEEfpuJaprrHFVQSZZgnKJn1z/JRjjZAwRrAxS9CFDkegFm/aL+7veHSmxbrb8l5+vjDXvUYohrMEIkKpiWp+kZcTsAhaIV4PfUF0cBM1U4D+0TqObnMwFoFZAgAAJA7MEgBoZ+wiQnq9RywBJZ3bmJw4+gjpV4q/N66X+DtlSEXMiFBUapy0z25VUuM4IqQLIdFHKMuSKqcyNFwrNL5vp6jPloLCCzJVzK4G5oEZQ+ixa0Y5pt6xUNTH5wSPV9UxatpcZLtzlIiQVXyK57TUuC8O1loeu0WEvJgluIEaodSkQfkdRaXG8T7bHEqL+yA4gmooYlqigxohAABIHESEAGhn7GqEvFylV4VQt7IC2/QXVQipn6MLIRkJ6t6hkDY/NN0impyiJsVas1O5HOsPM9IUyBLr5s+Wk3YWPuo69V5BL8w6h/760W669pzedOJkk+U1FlW1dk4LLkJIj8BUlObTrWFXLTtjA/ndqt+BGyI1LoZuNVPjFEc9/h7YdIG/q7pG63aormCc4uf0e1AdEvXIT8QsAUIoHeFopISvbVgaqvLvI5wW9/+1TrBNVZWgoSoAACQOhBAA7YydDTZP1uN5nyqE1LmOKjjs+gjZCSbVitzNwlqv/VGjN9ztXn2v6mTHqXAWIaR9Ho9l9rcGivv1ymTQLnrkBs8bWUToLoKWXkkujnheo08sNFzKkARyXaH6qbAgzAsIIcQi57jSl0jvEcQC0lEIKcs5RoRi1AghNS41qW9s1erQIvup08mviQ5uJiM7l5a0jhXPOUWE0FAVAAASB6lxALQzqih48vsj6Xv9Wmmk1nvH/n1ZtsJJLX5Xa37szBIkdrbZsSym2QbbaRxSfEhxpKbnsAizRoScxY2eGudWT6TDIuhYQ3NUWpk6Vkdr8NzolD4n2AWuxXCfYaqucVJ4SCHJz0k7bhm1Uxu51jaGokaJpsbFjgjBLCHVI0Jquikzpu6d0PN9LxRpce5CKHIfNUIAABAfEEIAtDPqBHbqkAo6v9KbGYA6qelUHOp7o6dVqZbKdvbZXswZ1JojFV3AWIRQeBukgUKWtt15XoWQ9tnxRIR46PttrKzVsbJQtBs6i7VyxULbDWEOESs1TmmoKoWJHAvvLymEOhfnR9UZcWTgdCJCsfoIcaqeWpgPUk8I6U13hx9fIf6+3jRe/OX/T04W/XCNAwCAxIEQAqCd6dsl1PeI5zFeGqnaMapXuXlfjR6oVs3qFWO9LsltguRkKKCLEp6ISZFRE57YSwMFffVqlEmPLKlEmyXEkxpn0IHaaCGkTxjtokKcGtehMCIu3dDts10jQpbUOBkRajVT4zqXRH8mpwc6myW4CCHZK0pJsXLCzWIcJAc1LZT/H8v9OyBrLw3O3k1NRoAe3tYvpt0+zBIAACBxUCMEQDvDk/v1D06lXCGC4rsyv+LnF9HRhibRi8ducqw271QFQF4g4LnhK0+kWODoKVZ2qWNc37P3+Elxs0SEspzFh5u40euTdGMFN3hzD4QjQpxSVy/T9bR1svjUU884ItQhbEsdC464xCjDidhns1lC+LPkWFgcRSJCebaRAWezBPvonxhX+Duu1eqs7ODxO6VWgRSICHFqXDiyNzN7jfj7bnAk1VDo/73bvlP/a7ulwAIAAIgGESEAzgAdi/M816SosAAa07uj4+SY07bscHKNc8IualJsI2B6lkdsvK01Qtbl1Dm7W7pbQK8Riis1zjB7APVU7MX1sdoZJuTGkxoXb0RIS43jCa9MhetcEm2SUXeqxbFGSO0vpAtVuY9rHZzxLOtBnVDKUadE8jgaJMXwzMBq8XdR2C3OyXnSLtqLzDgAADgDQmjBggXUt29fKigooAkTJtDatWsdl3322WfpggsuoI4dO4rblClTXJcHALjjFBFSyY9TCNn1ErITbqrgYMrDURX93aqldTwNVeMRiywLDtQ0ivs9FIGmj8VO5LFw8SqEvESEZOoSj1uOXY7lUG2jOUmV35cKR4ucxIwqep1qhNTIghNqXRlIDVgAq3DdXXXWHhqUvUekxS0NhtzimAIb50nbiBCUEAAAtK8QWrhwId199900d+5c+vjjj2nUqFE0ffp0OnjwoO3yK1asoOuvv56WL19Oq1atoqqqKpo2bRrt3bs33o8GAGg1QrI5aayIkJtZgljeLiJkk6bWozxi481UV5TYTsAGVpTQoG6lNKm6s5k+Z4cuUuJtqHogHBFShVBUjZBSr/T760bTxw9OFct4TY3jZqhuESH+OCk8Q81TI/2USBFr/Hmh9Egra7Yf8RQRikqNMyNCsYUQaoRSj/qmlqgLHGpaXF5JJ/M1t9Q41AgBAMAZFEJPPPEE3XrrrTRr1iwaOnQoPfPMM1RUVETPP/+87fIvvfQS3XHHHTR69GgaPHgwPffccxQMBmnZsmVtsf0AZDQT+nemp28YQ0t+OtnyfJR9dlb8ESG7NDVVcHTvUEClBSExMaZPKH0vNys0WWfx8+ZdF9Cfbomk99ihT9w4UuP1ojaXVEjXODVlTxd9qtiqLCswHfjKizyaJQTZPttlO4xITRanoMnUOBkROhg2dOBokDSXUFn2eegikl2Eyhr9s68R0iNFKlIUIiKUeuiRPLakl2lxb7ROoNFV5XGnxiEiBAAA8RFX0UJTUxOtW7eO7rvvPvO57Oxske7G0R4vNDQ0UHNzM3XqFLnapdPY2ChukpqaGvGX38e3eJHvSeS9qYxfx+XnsZ3OuB65ahj9ftk2eviKIZb3TxncJWqdXD/Dc2A5R+b7bp9pN0HPNlqpWZtAV5ZGxEN112JznQ9fMZgqS3Op56kdcY+NXeuk+10WGVSQk23ac7vBF1QO1TWJ+91KIiJCH6tlbEbQfK0419ukkaMysWqEpIZhdzhZ61EQjkTJXkBloq9QtGg5Uh8aw3n9O9GijQcsr9U3Ro55rZpNdiAsOt1gYckT7obGJtv94uX36Lf/g6nCtKHdqGb/Tvr7rpCI7tG0g87K3kutWTn0o1vuoOfXHTOX9WqWgD5CAADQjkLo8OHD1NraSt26dbM8z4+3bNniaR333nsv9ejRQ4gnJ+bPn0/z5s2Len7JkiUi+pQoS5cuJT/i13H5eWyJjIv9o+4fTrR9/bu0fX3s5QNZAQqGG4Ee2L+PFi1yTkdtPMUTLesk6s0334xabn9D5LARqD9EixYtMl8bxxetixIYmxH57C2fb6ZcyqaTUVVH0Rw9UUtHToWW27llg7ldx44esWxXQ11k/WtWfUD7N4aeP3TS/hA4vGOQNh6LXIHf9vV2W6Gosu597vuSY0lx27F1E39L5uOmuuP01Zc8ubWf1JY2fBP12udffEWLmr4U9w8fse6jjZ/wmN1TCQNBFjFZ9M5779Ne+yxKgds+44tXoO2ZNKAzndhq0Fv7soVYvrj1fbE7a3pOpuED+lDpxlpvQkj5bSI1DgAAUtg++9FHH6WXX35Z1A2x0YITHHHiOiQ1IiRri8rKXM7mLlc0+UQ/depUys31VheQDvh1XH4e25kc14Pr36bmcP1Ir549aMaMkY7L/sdX79OhU/WW52bMmGHb+2T+J2+L+xNHDaYZk/qe9tge+Phtag6nCY0YPow2n9xDNQfqYr4vmMMObKFoysxLLqSnNr0v7ldWdKUZMyKF5i/uWUO760+I+5MvOJ+G9Sgzoze/3rDcss6e5QX05/87iZ5+Zzut/PIwbfymhnpV9aZvdu+yLKdG25irr5hB8zYsMy282SDi4vPG0P9s+9hcZkDvHjS0eym9sTskbPSo2LXTzqOFz4RqRCQ9qnrTjBlDxf3/3rWaqC4UHWfOGTeWnv+CxZAzncqK6cSRBhozbgKdX9056nUv+0xG5EH7wCmOLISmZ4XS4k70m0mcaFoiIoheaoQi95EaBwAA7SiEunTpQoFAgA4csKZv8OPKykrX9/72t78VQuitt96ikSOdJ2RMfn6+uOnwifp0Jo+n+/5Uxa/j8vPYzsS48oTTVEhg5OYEXD8vV+s7JLdRp1x5bmBlme0y8Y5Nbeial5tDndhi2oMQkjUWXD9RlJ9nGYv6+aHvIUR+XmTbOpXmWEwfuGnt7Rf1p9KiAvrFZUMoENgqhFCQsqJqhLjuSI3+8Dq7luZT/ZFQ9KRbhwIqVLZJfF5xPuXn2h9yqzoVUXFB9DGPdZXcXj07L99D89ni8GS61chy3/8u+8yP//9SCf4tDczaI9LiGo0cqus7NapGj9NFvdUItfPGAgBAJpsl5OXl0dixYy1GB9L4YOLEiY7ve+yxx+jhhx+mxYsX07hx405viwEAnlAttAMxrhT37xpp2BqL//jB2XTnxQPo4kEV1BYEsq3byT2XvCBrb4rzciz9iKL6CCnfg2qkoC7Xq2Mh/fv3R1F1RamyrLTENkg3XbNz2WMhJOlWWhBlWMFmCE425v27FNu+ppolyG3gZX94bh/qXBwtnHSKwsILrnGpC18IkCYJ7wZHUFZhyCShVBVCqBECAIDUcI3jlDXuDfTHP/6RPv/8c7r99tupvr5euMgxN954o8VM4Te/+Q09+OCDwlWOew/t379f3OrqYl/xBQC0jRCyc4VTeeL7o+mDX37L03ovH9mD7pk+uM0mXWpEiOsdOnsUQhK+cq4KHLc+Qk5CxM55Ta7HzjXO7vvsojRLrexQENXLie2z1e28fGR3837fzk5CSO0jFLr/66uG08NXDY/ZG0rtb4SGqqkL/z6lbfYbreeaAtyaGgfXOAAASAkhdO2114o0tzlz5ghL7A0bNohIjzRQ2LVrF+3bt89c/umnnxZuc9/97nepe/fu5o3XAQBoP9SIRKwJEi+rWmOfSVRRwUKho4OttV0URvYecpsMqkJLTjJ1dGtq9X38ml1qnFtEqKIs31YI7T4mHBoEM0coQqhLsW2vJ1XASLEmBVAsccvIbYB9duoykPbQwHBa3FvBseb+LcmPpCSijxAAAKSQWcLs2bPFzQ42QlDZsWNHYlsGAGi7iFAKz5BUccKTQNnnx06YhL0IXCNC0UJIWb+DeODUOKftEkIoGFsIWSJCZXapcXmi0awUdRw1kvTzlBqnCSEP+1RuA1LjUpdvBUMmHyuDI6mWikwBrjY09poah4gQAACksGscACBJEaGUFkJZnoQQj0e6sulCSB2fPhdUI0m6eOCGr3/+cBf98rLBUeuVE9LmYJD0gJEucqJqhGyEEEeELjyrq7iCf96AzlRzqjlmRMiSGmeENkKOVa2tciI/bBSBiFCKYhg0ueV9My1OFbqlHiNCqviBDgIAgPiAEALAp+TFYZago6aTtTc5asQmK4vKZHfSqG2yn/izVbVbdERNIdOjLucP7CJubp9nFxGy+zw1IsRCSIoQ1SyB98l3x/YKraMmso7uZQV0rCFkBS5rQlgEqREh2U81J56IUHgMiAilJqWn9lLv1t0iLW5ZcIx4Lv4aIfU+lBAAAMQDhBAAPkWdiDulhNmliO05dpK+NbhtHOG8YElrc6kRchJCRewap0aEtNfV1+JJEZQCzd4sIXpbOpdEtpvT3uwiQioVZQX0wqxzxPM8bjVFsDA3EBJCSo0Qb4c62Y3LLEERVCB16Hk8ZJKwMjhKpMUxkRqhyOlZF9WONUJxV/0CAEBmg8MmAD6lp2J+4DUi9PKPz6WfTzuLfnONe6+v9jRLcEqNU2ue2CBBUpIfcBUF6lVyL+IhKjVO2Gdrltw2wlIVcF1L8qPMHXQhxLAF+ZjeHaPEqkyFsrrGWccQT0SoMUMiQgsWLBDupNywe8KECbR27VrHZV988UUhItSbW6PvNscwqMex0Pa90Toh6nenCqFgOC3SDrjGAQBA4kAIAeBTvj26h3m/xcYe2o5eHYto9rcGisL+pEWEiu1T49QIS1lBZJmi/ByL0NNtvdXJoZNrnP12yT5C0REhu+gUGx7MvriaHrx8qNhWNb2QU5vc6jwYdQwRIdQaNRmW31d8ESH/C6GFCxeK9g5z586ljz/+mEaNGkXTp0+ngwcPOr6nrKxMuJzK286dO8/cBh/6nEob91Ez5dJb4bQ4db+q6XB2roYS9BECAIDEgRACwKeMDUcamM/31VBauMZlZdmmAfHk//vjqsT9UVXlVFaYY6kRcjODUF+KJyIkI1Uf7TxOO+ucnehUfj59EN1yfj9zUiqjWHbRIB1126QQUgVMSziqI8fqRdTJ7zITaoSeeOIJuvXWW0VPu6FDh9IzzzxDRUVFooedE7yPKisrzZtsA3EmyP78dfF3U9E4qgunxan7VRU1soeU7Xpgnw0AAAmDGiEAfApPmOdeMZQe+vtmc3KeiuipcU4i4ebz+tKQ7mU0vGcZ/ejFDy2ucW6oE8p4aoTsDCPYFnt/zSma/a1qWvX1kZjr4MhQY0uQygtjR9jUbSsMRwNYwLBtNo9fBvXMiJCHui8ZRfN7RIh71a1bt87SzDs7O5umTJlCq1atcnwfN/bu06cPBYNBGjNmDD3yyCM0bNgw22UbGxvFTVJTE7q40NzcLG5x09hARlYebSi9iOho5Olgaws1a/urY2GO42cEg0rUsLU1sW1pY+Q2pMK2tCV+HZefx+bXcfl5bM0ex9VW44YQAsDHzJrUj64f3ztmWlYy0VPjmN9fN5o+2HaEFn60WzxmIcCvTRzQOSo1rjjPehjLcrtiHk9EyCbi8h8/OJv6dC62WGW7wRGhWo4IOTjhWbbTJiIkm6qyIYTsIyTH40XUmQ1VFdMFP3L48GFqbW2Niujw4y1btti+Z9CgQSJaNHLkSDpx4oRo8n3eeefRpk2bqFevkLOfyvz582nevHlRzy9ZskREnuJnIgVGjKGlX1v/by75x2IzsnPLoCzaUZtFzTvW0SKHrL3PDvHCoXWsX7+ejF3e0mDPBEuXLiU/4tdx+Xlsfh2Xn8e2NMa4Ghoa2uRzIIQA8DmpLIJ0BzY5ub9ydE9xU4WQSpmSalakNJ60I9F0ITVSJWENIkUQ33epYbeYFXhJjVOxCKHmIHHJlt5QNRBPQ1Xd/xvQxIkTxU3CImjIkCH0hz/8gR5++OGo5TnaxDVIakSoqqqKpk2bJmqN4oWvZvKJvkfvKqLD+8RzvEsvnznDXGaGl/Vs+IZe2rZR3B83dgxNG3rm0vtijW3q1KmUmxvfbz+V8eu4/Dw2v47Lz2Nr9jguGZU/XSCEAABJRU1Bc4rY6NGPMqXHSlRqnLaKRJvJ6nVAxfkBGtC1xFLP1BJDCeWHBU15nEKIRQ5/L+xYJy20ZUNVMzXOQ2G82VDV50KoS5cuFAgE6MCBA5bn+THX/niBT7hnn302bdu2zfb1/Px8cbN73+lMQvJzcyxRyHjXlZMTeX9uTk5KTYhO97tJVfw6Lj+Pza/j8vPYcmOMq63GDLMEAEBSCWhmCbGW0SMsxVpqnE6iRlqq+BrWMUgrfzbZ4qbnRWDJiBA3U42XgpyIhbZhGJHUuPDnevr8DIkI5eXl0dixY2nZsmXmc1z3w4/VqI8bnFr32WefUffu3elMogrueMw87H7fsM8GAID4QEQIAJBUcpXJX8BrREhNjVN6CtmR6ORQnaB2ybd+ptjWLO9CJN7UuKxwNKm2sUVYaKvu506fy6JLdYf7p3N7Z0yNEMNpazfddBONGzeOxo8fT08++STV19cLFznmxhtvpJ49e4paH+ahhx6ic889l6qrq+n48eP0+OOPC/vsf/7nf05aRDQeMw/7Grg22ywAAMgIIIQAAElFrcVxEkJRNUKKWYLaeJLJ0nLj2qJGqCwvOgXOy3pNIRRnXyae28o+MiyEZDTIzS3uf24ZTz9duIEeunI4nT+wi6gzWr71YMbYZ1977bV06NAhmjNnDu3fv59Gjx5NixcvNg0Udu3aJZzkJMeOHRN227xsx44dRUTpgw8+ENbbZxJVcNvVpcUjhNBHCAAA4gNCCACQOqlxThEhbYKo9hGKbZaQ2ORQdY0rs9ExXlLTupSE3tirvDCuz2YxF2mqGrLQdosI8aZM6N+ZPrjvEsvz+Rliny2ZPXu2uNmxYsUKy+Pf/e534pZsrKlx8Yd01J8hUuMAACA+IIQAAEklN4GIkDp51CNCOoleJVe3q8wms81LPcfcK4bRjBHdafJZXeP+fDMi1NJqGiU4fa6TM2AmNVRNV043NU79faOhKgAAxAcyigEASUWNvOjRjlsvCDWC/deZQyzPq2JAmgo4kXhqXLZralyFh15CPcoLhQ14vEXwIjVOOr7pqXE265KRH6fnMyUilI6crlkCIkIAAJA4iAgBAFK2RuiBmUNp9rcGRpkNVFeUOKao6XPBRK6y63SwiQj95w1j6Bd/+5TumnIWtQfxpMY5R4QyxywhXZF1ZHp0KLEaoTbbLAAAyAgghAAASUUVKnZXxO0c13p1LKK//J+Jnmypf3huX/rz2t00fZi3fjKSzsWRwiClJMmkuqKUXrljErUHPKGVIkY1S+Dn7WqTnIRQpthnpzO9OxaeXkRICQYiIgQAAPEBIQQASGkh5MT4fp08LdehKJfeu/fiuGuFWFxsmDOVjGArrVy2hM40kYgQ22cbrtbZzqlxmdFQNZ0Z2auDeb/mVMtp1ghBCAEAQDxACAEAkopai5PIFXGdrDY0TOAGqs3NzXSmYde4fNMsIUgtWjNVHe455BYR4vdzVKktvl/QtqgRz0O1jafXRwi7FwAA4gJmCQCApJIVZ5PSWHRSUtrSliwtIhQWQk71TgUxzBIYpMelLl5SPJ1QfxLoIwQAAPGBiBAAIKmoczcvvXmc+P11o+m19XvpjourKd3hb0G6xqlmCY6pcQ4RoaK8AH36q2lCEOUpkTeQWkzs35ne3Lg/ofciIgQAAIkDIQQASCrqVezTcXhjm2q++QWzj1Bza8zUOKeIEH+3ZQWJRxvAmeGhK4fTN8dP0vfGVZ3ehQREhAAAIC5wiRAAkFTUuVum17BcPrK7+HvrBf2p0MYswTE1ziEiBNKDrqX59Prs8+mfzu1zmhGhzP7/AwAA8QIhBABIKmwMIMl0IfTU9WfTJ3On0aiqcirMC4mbhqaIfbZTRGjyWV3P6HaC1AF9hAAAIHGQGgcASCrq3L4tzBLSGU5lky5ixfk5UUJI/37e/cXFtH73cbp8RCiSBDL7/w8iQgAAEB8QQgAAX5gl+A02OmAamloiQkj7fqo6FYkbyFwsfYSQ4wEAAHGBwyYAIGVS40CEorzQdar6plbafazBYqAAgAQRIQAASBycVQEASQVzN3uKwxGhk00t9ML7O8T9y4YjBQ5YgX02AAAkDlLjAAAgBSkK1wh9caBO/OU+QDeeF7+rGMgkswQoIQAAiAdEhAAASQXpPO41QpIxfcqporQgadsDUhP0EQIAgMSBEAIAJBXM3bwJofLCvKRtC0hdkBoHAACJAyEEAEgqmLvZUxw2S5CUFSKTGUSjOsUhIgQAAPEBIQQASCqwzLZHNlSVlBWE+gsBoIKGqgAAkDgQQgCApIK5mz35OdmWvkFl4UarAKio1xFglgAAAPEBIQQASCrfHt2TOhfn0RWjeiR7U1IKntSqdUJlBUiNA3agRggAABIFZ1YAQFLpUJhLa+6/xBL9ACGK83Ko9lSLuN+hCBEhEA0aqgIAQOJACAEAkk5OAMFpO6wRIQghEA1qhAAAIHEw+wAAgBSlKF8RQqgRAjHts6GEAAAgHiCEAAAgRSlSLLQREQJ2oKEqAAAkDoQQAACkQ2oc+giBGPbzKLMDAID4gBACAIAURZ3XIiIE7IB9NgAAJA6EEAAApCgtQcM2OgSAfY1QUjcFAADSDgghAABIUVpaI0IIV/uBHagRAgCAxIEQAgCAFKVViQgBYAdc4wAAIHEghAAAIEVpCQaTvQkgxUEfIQAASBwIIQAASIMaIQDsUOuCEBECAID4gBACAIAU5dYL+ou/04Z2S/amgBSlOD+HOhXnUWVZAeXALQEAANpfCC1YsID69u1LBQUFNGHCBFq7dq3jsps2baJrrrlGLM/Fvk8++WQiHwkAABnH5SO701t3T6YFN4xJ9qaAFCU3kE2L/+UCeuMn51t6CgEAAGgHIbRw4UK6++67ae7cufTxxx/TqFGjaPr06XTw4EHb5RsaGqh///706KOPUmVlZbwfBwAAGQtfPKquKBWTXQCcqCgtoM4l+cneDAAASDviPrs+8cQTdOutt9KsWbNo6NCh9Mwzz1BRURE9//zztsufc8459Pjjj9N1111H+fk4UAMAAAAAAACST048Czc1NdG6devovvvuM5/Lzs6mKVOm0KpVq9psoxobG8VNUlNTI/42NzeLW7zI9yTy3lTGr+Py89j8Oi4/j82v4/I6Nj+OGwAAAIhbCB0+fJhaW1upWzdr4S4/3rJlS5t9o/Pnz6d58+ZFPb9kyRIRfUqUpUuXkh/x67j8PDa/jsvPY/PruGKNjdObAQAAAMp0IXSm4IgT1yGpEaGqqiqaNm0alZWVxb0+vqLJJ/qpU6dSbm4u+QW/jsvPY/PruPw8Nr+Oy+vYZEQeAAAAyGgh1KVLFwoEAnTgwAHL8/y4LY0QuJbIrp6IT9SnMxE53fenKn4dl5/H5tdx+Xlsfh1XrLH5dcwAAABAXGYJeXl5NHbsWFq2bJn5XDAYFI8nTpzYHtsHAAAAAAAAAMlPjeOUtZtuuonGjRtH48ePF32B6uvrhYscc+ONN1LPnj1FnY80WNi8ebN5f+/evbRhwwYqKSmh6urqth4PAAAAAAAAALS9ELr22mvp0KFDNGfOHNq/fz+NHj2aFi9ebBoo7Nq1SzjJSb755hs6++yzzce//e1vxe3CCy+kFStWxPvxAAAAAAAAAJAcs4TZs2eLmx26uOnbty8ZhpHY1gEAAAAAAABAO4B25QAAAAAAAICMA0IIAAAAAAAAkHFACAEAAAAAAAAyDgghAAAAAAAAQMYBIQQAAAAAAADIOBJyjTvTSNe5mpqahN7f3NxMDQ0N4v1+6pLu13H5eWx+HZefx+bXcXkdmzzuwv3TCs5LmTc2v47Lz2Pz67j8PLZmj+Nqq3NTWgih2tpa8beqqirZmwIAABkJH4c7dOiQ7M1IGXBeAgCA9D83ZRlpcJkvGAyKxqylpaWUlZUV9/tZNfLJavfu3VRWVkZ+wa/j8vPY/DouP4/Nr+PyOjY+RfCJpkePHpZm2ZkOzkuZNza/jsvPY/PruPw8thqP42qrc1NaRIR4gL169Trt9fAX6qcfi9/H5eex+XVcfh6bX8flZWyIBEWD81Lmjs2v4/Lz2Pw6Lj+PrczDuNri3ITLewAAAAAAAICMA0IIAAAAAAAAkHFkhBDKz8+nuXPnir9+wq/j8vPY/DouP4/Nr+Py+9hSHT9/934dm1/H5eex+XVcfh5b/hkeV1qYJQAAAAAAAABAW5IRESEAAAAAAAAAUIEQAgAAAAAAAGQcEEIAAAAAAACAjANCCAAAAAAAAJBx+F4ILViwgPr27UsFBQU0YcIEWrt2LaUyv/rVr0SXcvU2ePBg8/VTp07RnXfeSZ07d6aSkhK65ppr6MCBA5Z17Nq1i2bOnElFRUVUUVFB99xzD7W0tJzxsaxcuZKuuOIK0fWXx/Haa69ZXmefjjlz5lD37t2psLCQpkyZQl9++aVlmaNHj9INN9wgmmqVl5fTLbfcQnV1dZZlPv30U7rgggvEPuZuxI899lhSx3XzzTdH7cNLL7005cc1f/58Ouecc6i0tFT8bq666iraunWrZZm2+v2tWLGCxowZI1xhqqur6cUXX0z62C666KKo/Xbbbbel9NiefvppGjlypNl4buLEifTmm2+m/f7KBHBuSs65ya/nJS9jw7kptY51fj0vpd25yfAxL7/8spGXl2c8//zzxqZNm4xbb73VKC8vNw4cOGCkKnPnzjWGDRtm7Nu3z7wdOnTIfP22224zqqqqjGXLlhkfffSRce655xrnnXee+XpLS4sxfPhwY8qUKcb69euNRYsWGV26dDHuu+++Mz4W/uwHHnjAeOWVV9iZ0Hj11Vctrz/66KNGhw4djNdee8345JNPjG9/+9tGv379jJMnT5rLXHrppcaoUaOM1atXG++++65RXV1tXH/99ebrJ06cMLp162bccMMNxsaNG40///nPRmFhofGHP/whaeO66aabxHar+/Do0aOWZVJxXNOnTzdeeOEF8XkbNmwwZsyYYfTu3duoq6tr09/f119/bRQVFRl33323sXnzZuOpp54yAoGAsXjx4qSO7cILLxTHCHW/8X5I5bH97//+r/HGG28YX3zxhbF161bj/vvvN3Jzc8U403l/+R2cm5J3bvLrecnL2HBuSq1jnV/PS+l2bvK1EBo/frxx5513mo9bW1uNHj16GPPnzzdS+WTDByE7jh8/Ln5If/3rX83nPv/8c3HAW7VqlXjMP5bs7Gxj//795jJPP/20UVZWZjQ2NhrJQj8oB4NBo7Ky0nj88cct48vPzxcHVoZ/2Py+Dz/80FzmzTffNLKysoy9e/eKx//5n/9pdOzY0TK2e++91xg0aFBSxiVPNldeeaXje9JhXMzBgwfFdr7zzjtt+vv7xS9+ISZUKtdee604KSRrbPKEc9dddzm+J13Gxr+b5557zlf7y2/g3JQa5ya/npcYnJvS71jn5/NSKp+bfJsa19TUROvWrRNhbUl2drZ4vGrVKkplOAzPoe3+/fuL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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 69
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-04T03:53:46.034043Z",
     "start_time": "2025-02-04T03:53:42.739796Z"
    }
   },
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "# load checkpoints\n",
    "model.load_state_dict(torch.load(\"checkpoints/imdb-adding/best.ckpt\", weights_only=True, map_location=\"cpu\"))\n",
    "\n",
    "model.eval()\n",
    "loss, acc = evaluating(model, test_dl, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3110\n",
      "accuracy: 0.8785\n"
     ]
    }
   ],
   "execution_count": 72
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
